ホームページ >データベース >mysql チュートリアル >「mysqli_real_escape_string」は SQL インジェクションを防ぐのに十分ですか?
質問:
提供された PHPコードの使用ですmysqli_real_escape_string は SQL インジェクション攻撃を防ぐのに十分ですか?
$email= mysqli_real_escape_string($db_con,$_POST['email']); $psw= mysqli_real_escape_string($db_con,$_POST['psw']); $query = "INSERT INTO `users` (`email`,`psw`) VALUES ('".$email."','".$psw."')";
答え:
いいえ、mysqli_real_escape_string だけに依存するだけでは SQL インジェクションやその他の SQL 攻撃を防ぐのに十分ではありません。
準備されたステートメントは、SQL を防ぐためのより堅牢なソリューションを提供します 注射。これらはデータと命令を分離し、ユーザー指定の入力がクエリの構造に干渉しないようにします。
準備されたステートメントを使用できない状況では、特定の目的のために厳密なホワイトリストを実装することで、ある程度の保護を提供できます。これには、悪意のある入力を防ぐために、各パラメータの許容値の事前定義リストを定義することが含まれます。
ホワイトリストと型キャストを使用する例:
switch ($sortby) { case 'column_b': case 'col_c': // Safe to use break; default: $sortby = 'rowid'; } $start = (int) $start; $howmany = (int) $howmany; if ($start < 0) { $start = 0; } if ($howmany < 1) { $howmany = 1; } // Execute the query using prepared statements $stmt = $db->prepare( "SELECT * FROM table WHERE col = ? ORDER BY {$sortby} ASC LIMIT {$start}, {$howmany}" ); $stmt->execute(['value']); $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
プリペアド ステートメントが必ず使用されるようにすることが重要です。特に MySQL を使用する場合、エミュレートされた準備はオフになります。
$db->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
以上が「mysqli_real_escape_string」は SQL インジェクションを防ぐのに十分ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。