0

ここに示すコードを使用しています。ファイルに保存する前に、データベースからフェッチしたデータにaddslashes()を使用しています。

$row[$j] = addslashes($row[$j]);

私の質問は、なぜこれを使用する必要があるのか​​ということです。データベースに保存するときにこれを行うと思いましたが、その逆ではありません。上記のスクリプトの結果をphpMyAdminからのエクスポートと比較すると、シリアル化されたデータを含むフィールドが異なります。データベースにインポートし直すときに問題が発生するかどうか知りたいのですが?

脚本:

'a:2:{i:0;s:5:\"Hello\";i:1;s:5:\"World\";}'

phpMyAdminエクスポート:

'a:2:{i:0;s:5:"Hello";i:1;s:5:"World";}'

アップデート

データベースに挿入すると、すべてのデータがエスケープされます。

mysqlからmysqliに変更します。

次のようなSQLファイル出力:

INSERT INTO test (foo, bar) VALUES (1, '\'single quotes\'\r\n\"double quotes\"\r\n\\back slashes\\\r\n/forward slashes/\r\n');

解決

$ mysqli-> real_escape_string()を使用し、addslashes()は使用しませんでした

4

4 に答える 4

2

あなたは2つの問題を混ぜ合わせていると思います。最初の問題はSQLインジェクションであり、これを防ぐには、データベースに入るデータをエスケープする必要があります。ただし、これを行うには、はるかに優れた方法があります。プリペアドステートメントとバインドされたパラメーターを使用します。PDOの例:

// setup a connection with the database
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');    
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// run query
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = :name');    
$stmt->execute(array(':name' => $name));

// get data
foreach ($stmt as $row) {
    // do something with $row
}

あなたがそれについて心配しなければならないもう一つのことは、基本的に攻撃者があなたのウェブサイトにコードを注入することを可能にするXSS攻撃です。これを防ぐにhtmlspecialchars()は、信頼できない可能性のある情報を含むデータを表示するときに常に使用する必要があります。

echo htmlspecialchars($dataFromUnsafeSource, ENT_QUOTES, 'UTF-8');

データベースに挿入すると、すべてのデータがエスケープされます。

プリペアドステートメントとバインドされたパラメータを使用する場合、これはもう必要ありません。

addlashes()を使用してから、str_replace()を使用して\ "を"に変更する必要がありますか?

addslashes()何かを防ぐためのくだらない方法のように聞こえます。したがって、AFAICTは必要ありません。

データベースへのアクセスに関する別の注意事項と、まだ古いmysql_*関数を使用している場合:

それらはもはや維持されておらず、コミュニティは非推奨プロセスを開始しています。赤いボックスが表示されますか?代わりに、プリペアドステートメントについて学び、 PDOまたはMySQLiのいずれかを使用する必要があります。決定できない場合は、この記事を選択するのに役立ちます。あなたが学びたいのであれば、ここに良いPDOチュートリアルがあります。

于 2012-09-29T17:52:37.810 に答える
2

データベースへの挿入

MySQL データベースにデータを挿入するときは、準備済みステートメントを使用するか、mysql_real_escape_string. addslashesデータベースとは関係がないため、使用しないでください。エスケープは一般的な用語として使用されますが、実際には多数の操作が含まれます。ここでは、エスケープの 2 つの用途について話しているようです。

  1. データベースに挿入される可能性のある危険な値をエスケープする
  2. 文字列の引用符をエスケープして文字列が壊れないようにする

ほとんどのデータベース エスケープ関数は、引用符をエスケープするだけではありません。これらは、不正な文字や \0 のような目に見えない文字をエスケープします ... これは、使用しているデータベースによっては、終了引用符を追加するだけでなく、挿入を解除する方法がたくさんあるためです。

PDO についての私のコメントを誰かが見逃しているように見えるので、ここでもう一度言及します。PDO やその他のデータベース抽象化システムを準備されたステートメントと共に使用する方がはるかに優れています。これは、値のエスケープについて心配する必要がなくなるためです。

db 値の出力/ダンプ

上記のバックアップでは、元のコーダーはaddslashes、mysql ダンプに出力された文字列が正しくフォーマットされ、再挿入時に壊れないことを確認するための簡単な省略形として使用しています。セキュリティとは関係ありません。

データベースから値を選択する

データベースへの挿入時に値をエスケープしたとしても、そのデータを文字列を使用するあらゆる種類のエクスポート ファイルに書き戻すときに、引用符を再度エスケープする必要があります。これは、文字列が適切にフォーマットされるように保護したいからです。

エスケープされたデータをデータベースに挿入する場合、使用される「エスケープ シーケンス」は元の値に変換されます。例えば:

INSERT INTO table SET field = "my \"escaped\" value"

データベースに入ると、値は実際には次のようになります。

my "escaped" value

したがって、データベースから引き戻すと、次のようになります。

my "escaped" value

したがって、これをフォーマットされた文字列/ダンプ、つまりパーサーによって読み戻されるダンプに配置する必要がある場合は、正しくフォーマットするために何らかのエスケープを行う必要があります。

$value_from_database = 'my "escaped" value';

echo '"' . $value_from_database . '"';

生産します:

"my "escaped" value"

これは通常の文字列パーサーを壊すので、次のようなことをする必要があります:

$value_from_database = 'my "escaped" value';

echo '"' . addslashes($value_from_database) . '"';

生産するには:

"my \"escaped\" value"

ただし、それが私であれば、二重引用符をターゲットにしてエスケープします。

$value_from_database = 'my "escaped" value';

echo '"' . str_replace('"', '\\"', $value_from_database) . '"';
于 2012-09-29T17:46:10.627 に答える
0

データを変更せずに保存する必要があります。

データを出力するとき、またはデータベースクエリ内など、他のデータの「内部」に配置するときに、必要なエスケープを実行する必要があります。

于 2012-09-29T17:30:32.517 に答える
0

david walsh のブログに書かれているように、addslashes と ereg_replace の代わりに mysql_escape_string() を使用してください。

試してみてください。:)

于 2012-09-29T17:33:11.653 に答える