PHP および SQL インジェクション攻撃 [2]
魔法の名言
前述したように、SQL インジェクションは主に、攻撃の目的を達成するために、安全でないデータをデータベースに送信します。 SQLインジェクション攻撃を防ぐために、PHPには入力文字列を処理し、下位レベルで入力セキュリティの事前処理を行う機能、つまりMagic Quoteが搭載されています。 (php.ini magic_quotes_gpc)。 magic_quotes_gpc
オプションが有効な場合、入力文字列内の単一引用符、二重引用符、およびその他の文字の前にバックスラッシュが自動的に付けられます。
しかし、Magic Quotes はあまり普遍的なソリューションではなく、潜在的に危険な文字をすべてブロックするわけではなく、多くの
サーバーでは Magic Quotes が有効になっていません。したがって、SQL インジェクション
を防ぐために、他のさまざまな方法も使用する必要があります。
多くのデータベースは、この入力データ処理機能をネイティブに提供します。たとえば、PHP の MySQL 操作関数には、特殊文字やデータベース操作エラーの原因となる可能性のある文字をエスケープできる mysql_real_escape_string() という関数があります。
参照:
http://cn2.php.net/mysql_real_escape_string
興味がある場合は、以下のコメントを読むことができます:)
このコードを見てください:
//Magic Quotes 機能が有効になっている場合
if (get_magic_quotes_gpc()) {
$name =tripslashes($name);
}else{
$name = mysql_real_escape_string($name);
}
mysql_query("SELECT * FROM users WHERE name='{$name}' ");
データベースが提供する関数を使用する前に、上記の例と同様に、Magic Quotes がオンになっているかどうかを確認する必要があります。そうしないと、プロセスが 2 回繰り返されるとエラーが発生します。 MQ が有効な場合、実際の
データを取得するには追加を削除する必要があります。
上記のデータを文字列形式で前処理することに加えて、バイナリデータをデータベースに保存する場合は、前処理にも注意する必要があります。そうしないと、データがデータベース自体の保存形式と競合し、データベースがクラッシュしたり、データ レコードが失われたり、データベース全体が失われたりする可能性があります。 PostgreSQL などの一部のデータベースは、バイナリ データのエンコードに特に使用される関数 pg_escape_bytea() を提供しており、Base64 と同様にデータをエンコードできます。
例:
// プレーンテキストデータの場合:
pg_escape_string($ Regular_strings);
// バイナリデータの場合:
pg_escape_bytea($binary_data); 別のケースでは、このメカニズムも使用する必要があります。 。それは、データベース システム自体ではサポートされていない中国語、日本語などのマルチバイト言語
です。それらの一部には、バイナリ データ範囲と重複する ASCII 範囲があります。
ただし、データをエンコードすると、LIKE abc% などのクエリ ステートメントが無効になる可能性があります。
http://www.bkjia.com/PHPjc/318373.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/318373.html