SQL 攻撃に対するアプリケーションのセキュリティは、重大な懸念事項です。開発者は、これらの攻撃から保護するために、mysql_real_escape_string() や mysql_escape_string() などの関数に依存することがよくあります。しかし、これらの関数は絶対的な保護を保証するのに十分ですか?
mysql_real_escape_string() と mysql_escape_string() の制限
これらの関数は、見かけの有用性にもかかわらず、いくつかの点で不十分です。 :
SQL インジェクション攻撃: これらの関数は従来の SQL インジェクション攻撃に対して部分的な保護を提供する可能性がありますが、テーブル名、列名、または LIMIT をターゲットとする攻撃などの高度な技術に対しては依然として脆弱です。
LIKE 攻撃: 「%」の検索など、LIKE 演算子を悪用する攻撃は、意図しない結果を返し、セキュリティを侵害する可能性があります。
Charset Exploits : 特に Internet Explorer における文字セットの脆弱性により、ハッカーが SQL インジェクションの実行などの重要な制御を取得できる可能性があります。
プリペアド ステートメントによるプロアクティブな保護
これらの制限に対処するには、セキュリティ専門家が準備されたステートメントを使用することを推奨します。プリペアド ステートメントは、データベース サーバー自体が SQL 実行を処理できるようにすることで、プロアクティブなアプローチを採用します。このサーバー側の検証により、予期しない SQL クエリや悪意のある SQL クエリの実行が防止され、既知および未知の攻撃に対する堅牢な防御が提供されます。
準備されたステートメントを含むサンプル コード
以下はプリペアドステートメントの使用を示すサンプルコードです:
$pdo = new PDO($dsn); $column = 'url'; $value = 'http://www.stackoverflow.com/'; $limit = 1; $validColumns = array('url', 'last_fetched'); // Validate $column for security if (!in_array($column, $validColumns) { $column = 'id'; } $statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value));
結論
一方、mysql_real_escape_string() と mysql_escape_string() は SQL に対してある程度の保護を提供します。攻撃には制限があり、包括的なセキュリティには不十分です。既知および未知の攻撃に対する堅牢な保護を実現するには、準備済みステートメントの使用が推奨されるアプローチです。プリペアド ステートメントは、サーバー側の検証を活用することで予防的な防御を提供し、重要なデータのセキュリティを確保し、アプリケーションを脆弱性から保護します。
以上がmysql\\_real\\_escape\\_string() と mysql\\_escape\\_string() は SQL 攻撃に対して十分な保護を提供しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。