ホームページ  >  記事  >  バックエンド開発  >  PHP および SQL インジェクション攻撃を防ぐためのヒント_PHP チュートリアル

PHP および SQL インジェクション攻撃を防ぐためのヒント_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:24:42692ブラウズ

SQL インジェクション攻撃がどのように実装されるか、そしてそれを防ぐ方法について話しましょう。

この例を見てください:

コードをコピー コードは次のとおりです:

// 想定される入力
$name = "ilia'; DELETE FROM users;";
mysql_query("SELECT * FROM users WHERE name=' {$name}'");

データベースによって実行された最後のコマンドは次のとおりであることは明らかです:

SELECT * FROM users WHERE name=ilia; DELETE FROM users

これは、データベース - すべてのレコード すべて削除されました。

ただし、使用しているデータベースが MySQL の場合、幸いなことに、mysql_query() 関数ではそのような操作を直接実行することはできません (複数のステートメントの操作を 1 行で実行することはできません)。安心してください。使用しているデータベースが SQLite または PostgreSQL で、そのようなステートメントをサポートしている場合は、悲惨な結果に直面することになります。

前述したように、SQL インジェクションは主に、攻撃の目的を達成するために、安全でないデータをデータベースに送信します。 SQLインジェクション攻撃を防ぐために、PHPには入力文字列を処理し、下位レベルで入力に対して事前のセキュリティ処理を実行できる機能、つまりMagic Quoteが付属しています。 (php.ini magic_quotes_gpc)。 magic_quotes_gpc オプションが有効な場合、入力文字列内の単一引用符、二重引用符、およびその他の文字の前にバックスラッシュが自動的に付けられます。

しかし、Magic Quotes はあまり普遍的なソリューションではなく、すべての潜在的に危険な文字をブロックするわけではなく、Magic Quotes は多くのサーバーで有効になっていません。したがって、SQL インジェクションを防ぐために、他のさまざまな方法も使用する必要があります。

多くのデータベース自体がこの入力データ処理機能を提供します。たとえば、PHP の MySQL 操作関数には、特殊文字やデータベース操作エラーの原因となる可能性のある文字をエスケープできる mysql_real_escape_string() という関数があります。

このコードを見てください:
コードをコピーします コードは次のとおりです:

//魔法の引用符機能が有効な場合
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 ($ regula_strings)
// バイナリ データの場合:
pg_escapea_data ($ bin) ary_data ) ;;


別のケースでは、そのようなメカニズムを採用する必要もあります。つまり、データベース システム自体がサポートしていない中国語、日本語などのマルチバイト言語です。それらの一部には、バイナリ データ範囲と重複する ASCII 範囲があります。

ただし、データをエンコードすると、LIKE abc% などのクエリ ステートメントが失敗する可能性があります。


http://www.bkjia.com/PHPjc/324227.html
www.bkjia.com

本当http://www.bkjia.com/PHPjc/324227.html技術記事 SQL インジェクション攻撃がどのように実装されるか、そしてそれを防ぐ方法について話しましょう。 この例を見てください: コードのコピー コードは次のとおりです: // 想定される入力 $name = "ilia'; DELETE FROM users;"; mysql_quer...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。