MySQL インジェクション攻撃: 詳細
はじめに
Web アプリケーションのセキュリティの確保は非常に重要であり、データベース保護はこの取り組みの重要な部分です。この記事では、SQL 攻撃に対する保護における mysql_real_escape_string() および mysql_escape_string() の使用の有効性を検証します。
セキュリティにはエスケープ関数で十分ですか?
mysql_real_escape_string() および mysql_escape_string () は一般的に次の目的で使用されます。 SQL クエリにデータを挿入する前にデータをエスケープします。しかし、これらの関数はすべての攻撃ベクトルに対して十分な保護でしょうか?
専門家の意見
専門家によると、mysql_real_escape_string() は SQL インジェクションに対する完全な保護を提供しません。これは、クエリ内の PHP 変数をエスケープすることのみを目的としているためです。テーブル名、列名、または LIMIT フィールドのエスケープは処理できません。
既知の攻撃に対する脆弱性
次の例を考えてみましょう:
$sql = "SELECT number FROM PhoneNumbers " . "WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
このクエリ$field または $value に悪意のある入力が含まれている場合、SQL インジェクションに対して脆弱です。ハッカーは、エスケープを回避して不正なコマンドを実行する悪意のあるクエリを作成する可能性があります。
特定の攻撃ベクトル
デモ
次のコードは、これらの攻撃が悪用される方法を示しています。
$sql = sprintf("SELECT url FROM GrabbedURLs WHERE %s LIKE '%s%%' LIMIT %s", mysql_real_escape_string($argv[1]), mysql_real_escape_string($argv[2]), mysql_real_escape_string($argv[3]));
解決策:プリペアド ステートメント
専門家は、関数をエスケープする代わりにプリペアド ステートメントを使用することを推奨しています。プリペアド ステートメントは、有効な SQL のみが実行されることを保証するサーバー側の技術です。このアプローチは、既知および未知の SQL インジェクションに対する包括的な保護を提供します。
PDO を使用した例
$sql = 'SELECT url FROM GrabbedURLs WHERE ' . $column . '=? LIMIT ?'; $statement = $pdo->prepare($sql); $statement->execute(array($value, $limit));
このコードは、プリペアド ステートメントを使用してユーザー入力をエスケープし、クエリを実行します。
結論
ながらmysql_real_escape_string() および mysql_escape_string() は SQL インジェクションに対するある程度の保護を提供しますが、完全なセキュリティには十分ではありません。準備済みステートメントは、堅牢なデータベース セキュリティのために推奨されるアプローチです。
以上が「mysql_real_escape_string()」と「mysql_escape_string()」は MySQL インジェクション攻撃を防ぐのに十分ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。