ホームページ  >  記事  >  データベース  >  PDO プリペアドステートメントを使用して MySQL インジェクションを防ぐ方法: `mysql_real_escape_string()` と同等の PDO はありますか?

PDO プリペアドステートメントを使用して MySQL インジェクションを防ぐ方法: `mysql_real_escape_string()` と同等の PDO はありますか?

DDD
DDDオリジナル
2024-10-26 07:58:03996ブラウズ

How to Prevent MySQL Injection with PDO Prepared Statements: Is There a PDO Equivalent to `mysql_real_escape_string()`?

mysql_real_escape_string() と同等の PDO

mysql_* から PDO へのコード移行では、mysql_real_escape_string() と同等のものを探しています。ただし、PDO には直接同等のものがないことに注意することが重要です。

技術的には、PDO::quote() は存在しますが、一般的には使用されておらず、mysql_real_escape_string() に匹敵するものではありません。

適切な MySQL インジェクション防止

プリペアド ステートメントで PDO を適切に使用すると、MySQL インジェクションに対する保護が得られます。準備されたステートメントは入力をサニタイズし、mysql_real_escape_string() のような関数の必要性を排除します。

準備されたステートメントを使用した安全なデータベース クエリの例

安全なデータベースの例は次のとおりです。 PDO 準備済みステートメントを使用したクエリ:

$db = new PDO(
    "mysql:host=localhost;dbname=xxx;charset=utf8",
    "xxx",
    "xxx",
    [
        PDO::ATTR_EMULATE_PREPARES => false,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]
);

// Prepared statement
$stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");

// Execute statement
$stmt->execute(array($_POST['color']));

// Fetch result
$cars = $stmt->fetchAll(PDO::FETCH_ASSOC);

ご覧のとおり、$_POST['color'] をエスケープまたはサニタイズしていませんが、PDO と次の機能のおかげで、コードは MySQL インジェクションから安全なままです。準備されたステートメント。

追加メモ

  • セキュリティのため、DSN では常に charset=utf8 を渡します。
  • PDO がエラーを例外として表示できるようにするエラー処理を改善するため。
  • 古い MySQL バージョン (

結論

上で示したように準備されたステートメントを使用することは、mysql_* 関数に頼るよりも常に安全です。 PDO に組み込まれた保護メカニズムは、MySQL インジェクションを防ぐためのより堅牢で安全なアプローチを提供します。

以上がPDO プリペアドステートメントを使用して MySQL インジェクションを防ぐ方法: `mysql_real_escape_string()` と同等の PDO はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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