ホームページ >データベース >mysql チュートリアル >「mysql_real_escape_string()」と「mysql_escape_string()」は MySQL インジェクション攻撃を防ぐのに十分ですか?

「mysql_real_escape_string()」と「mysql_escape_string()」は MySQL インジェクション攻撃を防ぐのに十分ですか?

DDD
DDDオリジナル
2024-12-17 10:23:25732ブラウズ

Are `mysql_real_escape_string()` and `mysql_escape_string()` Enough to Prevent MySQL Injection Attacks?

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 インジェクションに対して脆弱です。ハッカーは、エスケープを回避して不正なコマンドを実行する悪意のあるクエリを作成する可能性があります。

特定の攻撃ベクトル

  • LIKE 攻撃: mysql_real_escape_string( ) は、LIKE "$data%" などの LIKE 攻撃に対しては効果がありません。これにより、テーブル内のすべてのレコードが公開され、機密情報が漏洩する可能性があります。
  • 文字セットのエクスプロイト: これらのエクスプロイトは、Internet Explorer および PHP の文字セット処理の脆弱性を利用します。これらにより、ハッカーが任意の 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]));
  • 入力 1: "http://www.reddit.com" で始まる URL を返します
  • 入力 2: すべての結果 (エクスプロイト) を返します
  • 入力 3: 予期しない SQL クエリを実行します

解決策:プリペアド ステートメント

専門家は、関数をエスケープする代わりにプリペアド ステートメントを使用することを推奨しています。プリペアド ステートメントは、有効な 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 サイトの他の関連記事を参照してください。

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