ホームページ >データベース >mysql チュートリアル >「mysqli_real_escape_string()」は SQL インジェクション攻撃を防ぐのに十分ですか?
MySQLi の "mysqli_real_escape_string" は SQL 攻撃に対して十分ですか?
コードは、"mysqli_real_escape_string()" を使用して SQL インジェクションから保護しようとしています。ただし、uri2x で示されているように、この対策は不十分です。
SQL インジェクションに対する脆弱性
「mysqli_real_escape_string()」は特定の文字のみをエスケープするため、クエリは SQL に対して脆弱なままになります。注射攻撃。たとえば、次のコードは依然として脆弱である可能性があります:
$email = mysqli_real_escape_string($db_con, $_POST['email']); $query = "SELECT * FROM users WHERE email = '" . $email . "'";
攻撃者は、「email'@example.com」のような電子メール アドレスを入力してクエリを悪用し、エスケープされた入力の後に追加の SQL ステートメントを追加する可能性があります。
準備されたステートメントの使用
の代わりに「mysqli_real_escape_string()」、SQL インジェクションを防ぐ最も効果的な方法は、準備されたステートメントを使用することです。プリペアド ステートメントはクエリ文字列からデータを分離し、データの汚染を防ぎます。
$stmt = $db_con->prepare("INSERT INTO users (email, psw) VALUES (?, ?)"); $stmt->bind_param('ss', $email, $psw); $email = mysqli_real_escape_string($db_con, $_POST['email']); $psw = mysqli_real_escape_string($db_con, $_POST['psw']); $stmt->execute();
厳密な文字のホワイトリスト
プリペアド ステートメントが実現できない状況では、厳密な文字を実装します。ホワイトリストはセキュリティを保証できます。これには、入力をフィルタリングして、許可された文字のみが含まれていることを確認する必要があります。
結論
「mysqli_real_escape_string()」だけでは、SQL インジェクションから保護するには不十分です。準備されたステートメントと厳格なホワイトリストにより、これらの攻撃に対するより強力な保護手段が提供されます。
以上が「mysqli_real_escape_string()」は SQL インジェクション攻撃を防ぐのに十分ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。