ホームページ >データベース >mysql チュートリアル >「mysqli_real_escape_string」は SQL インジェクションを防ぐのに十分ですか?

「mysqli_real_escape_string」は SQL インジェクションを防ぐのに十分ですか?

DDD
DDDオリジナル
2024-12-17 20:30:19226ブラウズ

Is `mysqli_real_escape_string` Sufficient to Prevent SQL Injection?

SQL インジェクションを防ぐには mysqli_real_escape_string で十分ですか?

質問:

提供された 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 サイトの他の関連記事を参照してください。

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