データベースへの挿入
MySQL データベースにデータを挿入するときは、準備済みステートメントを使用するか、mysql_real_escape_string
. addslashes
データベースとは関係がないため、使用しないでください。エスケープは一般的な用語として使用されますが、実際には多数の操作が含まれます。ここでは、エスケープの 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) . '"';