SQL インジェクション攻撃は、ハッカーが Web サイトを攻撃するために使用する最も一般的な方法です。サイトで厳密なユーザー入力検証が使用されていない場合、SQL インジェクション攻撃に対して脆弱になることがよくあります。 SQL インジェクション攻撃は通常、不正なデータやクエリ ステートメントをサイト データベースに送信することによって実行され、データベース内のレコードが公開、変更、または削除される可能性があります。 SQL インジェクション攻撃がどのように実装されるか、そしてそれを防ぐ方法について話しましょう。
この例を見てください:
// 想定される入力
$name = "ilia'; ユーザーから削除します;";
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 = ストリップスラッシュ($name);
}その他{
$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($regulator_strings);
// バイナリデータの場合は:
pg_escape_bytea($binary_data);
別のケースでは、そのような仕組みも採用する必要があります。つまり、データベース システム自体がサポートしていない中国語、日本語などのマルチバイト言語です。それらの一部には、バイナリ データ範囲と重複する ASCII 範囲があります。
ただし、データをエンコードすると、LIKE abc% のようなクエリ文が無効になる場合があります。
を通じて発生します。