ホームページ  >  記事  >  バックエンド開発  >  PHP関数でSQLインジェクションのバックスラッシュを解決する

PHP関数でSQLインジェクションのバックスラッシュを解決する

巴扎黑
巴扎黑オリジナル
2016-11-23 15:30:241280ブラウズ

マジッククオートとは

オンにすると、すべての ' (一重引用符)、" (二重引用符)、(バックスラッシュ)、および 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)

データベースクエリステートメントなどの特定の文字の前にバックスラッシュが追加された文字列を返します。これらの文字は単一の文字です。引用符 (')、二重引用符 (")、バックスラッシュ ()、および NUL (NULL 文字)。

addslashes() の使用例は、データベースにデータを入力する場合です。たとえば、O'reilly という名前をデータベースに挿入するには、エスケープする必要があります。ほとんどのデータベースはエスケープ文字として O'reilly を使用します。これにより、余分な .html を挿入することなく、データがデータベースに保存されます。 PHP ディレクティブ magic_quotes_sybase が on に設定されている場合、「挿入時にエスケープされる」ことを意味します。

デフォルトでは、PHP 命令 magic_quotes_gpc がオンになっており、主にすべての GET、POST、COOKIE データに対してaddslashes() が自動的に実行されます。二重エスケープになるため、magic_quotes_gpc によってエスケープされた文字列に対して addslashes() を使用しないでください。この状況が発生した場合は、関数 get_magic_quotes_gpc() を使用して検出できます。

stripslashes

(PHP 4, PHP 5)

stripslashes —addslashes() で引用された文字列の引用符を解除します

説明

string Stripeslashes ( string $str )

引用符で囲まれた文字列の引用符を解除します。

注: magic_quotes_sybase がオンの場合、バックスラッシュは削除されませんが、代わりに 2 つのアポストロフィが 1 つに置き換えられます。

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 ' ]);

//magic_quotes_gpc=On なので、機密文字の前にバックスラッシュを再度追加します

$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;
}
?>


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。