ファイルを検討してくださいa.php
:
<?php
echo $_GET['a'];
?>
a.php?a=abcd'
印刷しabcd\'
ます。
PHPの自動エスケープ引用符だと思いますが、これに関するドキュメントが見つかりませんでした。
それは本当ですか?確認したいので-私はかなり怠惰なので、PHPソースコードでのSQLインジェクションを妨げませんでした...
ファイルを検討してくださいa.php
:
<?php
echo $_GET['a'];
?>
a.php?a=abcd'
印刷しabcd\'
ます。
PHPの自動エスケープ引用符だと思いますが、これに関するドキュメントが見つかりませんでした。
それは本当ですか?確認したいので-私はかなり怠惰なので、PHPソースコードでのSQLインジェクションを妨げませんでした...
構成でmagic_quotes_gpcがアクティブな場合、PHPはこれを行います。この機能は廃止され、将来的には廃止される予定です。新しいコードを書くときに非推奨の機能に依存するのは良くありません(実際には、まったくばかげています)。
マジッククォートはすべての文字セットを正しく処理しないため、SQLインジェクションから保護するには不十分であることに注意してください。魔法の引用符を逆にして、代わりにmysql_real_escape_string(または他のデータベース拡張機能の同様のもの)を使用することをお勧めします。
構成ファイルmagic_quotes_gpc
にあるOn
かどうかによって異なります。php.ini
この構成ディレクティブは、開発者がSQL インジェクション攻撃から身を守るために導入されました。それらが何であるかわからない場合は、ウィキペディアのエントリを注意深く読むことをお勧めします。
問題は、is insecure and unpredictableだけに依存するmagic_quotes
ことは安全ではなく、予測不可能であり、この機能も将来の PHP バージョンで削除されることです。SQL インジェクションから保護する最善の方法は、準備済みステートメント ( PDOまたはMySQLiを使用) を使用するか、データベースに固有のエスケープ関数を使用することです。
ただし、magic_quotes
がオンのときに入力データをエスケープしようとすると、二重にエスケープされた文字列が取得される可能性があります (これは良くありません)。これに対抗するために、通常は がオンかどうかを検出し、オンの場合magic_quotes
はOn
追加されたスラッシュを で削除しますstripslashes()
。
データベースエスケープ関数/メソッドを呼び出す前にこれを行う人もいますが、個人的にはページの読み込み時に行うことを好みます。これにより、データの一貫性が高まり、エラーが発生しにくくなります。PHP 5.3 以降を使用している場合は、次のスニペットで無効にする必要がありますmagic_quotes
。
if (get_magic_quotes_gpc() === 1)
{
$_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
$_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
$_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
$_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true);
}
古いバージョンの PHP を実行している場合は、PHP マニュアルにもかなり適切なスニペットがあります。
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
SQL入力を適切にエスケープするには、コードを更新する必要があります。または、PDOを使用して、クエリとは別にクエリ引数を渡すことができます。
PHPにはがありますがmagic_quotes_gpc
、デフォルトでは無効になっており、PHP 6で削除されます。さらに、コードが安全でないか障害が発生する可能性があるため、自動的に追加された引用符を削除するget_magic_quotes_gpc()
ことをお勧めしますtrue
。
mysqli_real_escape_string()は良いスタートです。