ホームページ >バックエンド開発 >PHPチュートリアル >PHP関数でSQLインジェクションのバックスラッシュを解決する
マジッククオートとは
オンにすると、すべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、および NULL 文字はバックスラッシュで自動的にエスケープされます。これは、addslashes( ) と同じ効果があります。
マジック クォート命令は 3 つあります:
magic_quotes_gpc は HTTP リクエスト データ (GET、POST、COOKIE) に影響します。
magic_quotes_runtime オンにすると、データを取得するほとんどの関数によってデータが返されます。データベースやテキスト ファイルなどの外部ソースはバックスラッシュでエスケープされます。このオプションは PHP の実行時に変更できます。デフォルト値は set_magic_quotes_runtime() および get_magic_quotes_sybase() を参照してください。バックスラッシュの代わりに一重引用符を使用します。このオプションがオンになっている場合、一重引用符は '' としてエスケープされます。方法については、ini_get() を参照してください。値を取得するには、バックスラッシュを使用します。バックスラッシュで囲まれた文字列
説明
stringaddslashes (string $str)
SQL インジェクションの問題が ASP で話題になりました? 国内外の有名な PHP プログラムが「苦境に陥った」。 SQLインジェクションの詳細についてはネット上に記事が多すぎるのでここでは紹介しません。
Web サイトスペースの php.ini ファイル内の magic_quotes_gpc がオフに設定されている場合、フォームによって送信されたコンテンツには一重引用符 (' ) などの機密文字が含まれる可能性があるため、PHP は機密文字の前にバックスラッシュ () を追加しません。 、SQL インジェクションの脆弱性につながります。この場合、addslashes() を使用して問題を解決できます。これは、機密文字の前にバックスラッシュを自動的に追加します。ただし、上記の方法は、magic_quotes_gpc=Off の場合にのみ適用されます。開発者としては、各ユーザーの magic_quotes_gpc がオンかオフかわかりません。すべてのデータが addslashes() で使用される場合、それは「無実の人々を無差別に殺害する」ことになりませんか? magic_quotes_gpc=On で、addslashes() 関数が使用されている場合を見てみましょう:
//変数 $_POST['message'] がフォームから送信された場合、コンテンツはトムの本です
/ /これは MySQL データベースに接続するためのコードです。自分で記述してください
//$_POST['message'] の機密文字の前にバックスラッシュを追加します
$_POST['message'] =addslashes($_POST['message ' ]);
$sql = "INSERT INTO msg_table VALUE('$_POST[message]');";
//リクエストを送信し、メッセージを保存しますコンテンツをデータベースに追加します
$query = mysql_query($sql);
//このレコードをデータベースから抽出して出力すると、トムの本が表示されます
?>
この場合、magic_quotes_gpc =On環境では、入力されたすべての一重引用符 (') は (') になります...
実際、この問題は get_magic_quotes_gpc() 関数を使用して簡単に解決できます。 magic_quotes_gpc=On の場合、この関数は TRUE を返し、magic_quotes_gpc=Off の場合、FALSE を返します。この時点で、問題が解決したことに多くの人が気づいたはずです。コードを参照してください:
//magic_quotes_gpc=Off の場合は、船荷証券に送信される $_POST['message'] の機密文字にバックスラッシュを追加します
//magic_quotes_gpc=On の場合は、
if ( !get_magic_quotes_gpc) を追加しないでください()) {
$_POST['message'] =addslashes($_POST['message']);
} else {}
?>
実際、この時点で問題は解決されています。ここでもう 1 つの小さなトリックをご紹介します。
フォームに複数の変数が送信される場合があります。場合によっては、12 を超える変数が存在する場合もあります。では、addslashes() を何度もコピー&ペーストするのは少し面倒でしょうか?フォームや URL から取得したデータはすべて $_POST、$_GET などの配列形式で表示されるため、関数:
関数引用符($content)
{
//magic_quotes_gpc=Off の場合、処理を開始します
if (!get_magic_quotes_gpc()) {
//$content が配列かどうかを判断します
if (is_array($content)) {
/ /If $content は配列であり、その各要素を処理します
foreach ($content as $key=>$value) {
$content[$key] =addslashes($value);
}
} else {
// $content が配列でない場合、一度だけ処理されます
addslashes($content);
}
} else {
//magic_quotes_gpc=On の場合、処理されません
}
//Return $content
return $content;
}
?>