ホームページ >データベース >mysql チュートリアル >PHP のパラメータ化されたクエリは SQL インジェクションからどのように保護されますか?

PHP のパラメータ化されたクエリは SQL インジェクションからどのように保護されますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-28 06:00:03961ブラウズ

How do Parameterized Queries in PHP Protect Against SQL Injection?

MySQL 接続を使用した PHP のパラメータ化されたクエリ

Web 開発の領域では、SQL インジェクションは重大なセキュリティ上の脅威を引き起こします。悪意のあるクエリをでっち上げることで、攻撃者は認証メカニズムをバイパスし、機密データにアクセスすることができます。パラメータ化されたクエリは、この脆弱性に対する確実な解決策を提供します。

SQL インジェクションに対する保護が不十分な PHP ログイン ページのコードのスニペットを考えてみましょう。

<code class="php">$userName = $_POST["username"];
$userPass = $_POST["password"];

$query = "SELECT * FROM users WHERE username = '$userName' AND password = '$userPass'";

$result = mysqli_query($dbc, $query);
$row = mysqli_fetch_array($result);

if (!$row) {
    echo "No existing user or wrong password.";
}</code>

パラメータ化されたクエリを使用するには、データベースへの接続を確立し、パラメータ化されたステートメントを準備する必要があります。次のコードは、変更された例を示しています。

<code class="php">$stmt = mysqli_prepare($dbc, "SELECT * FROM users WHERE username = ? AND password = ?");
mysqli_stmt_bind_param($stmt, "s", $userName);
mysqli_stmt_bind_param($stmt, "s", $userPass);
mysqli_stmt_execute($stmt);
$row = mysqli_stmt_fetch($stmt);</code>

コードの内訳は次のとおりです。

  • mysqli_prepare() は、パラメーターを表すプレースホルダー (?) を使用してパラメーター化されたステートメントを準備します。
  • mysqli_stmt_bind_param() は値をプレースホルダー パラメーターにバインドします。
  • mysqli_stmt_execute() はパラメーター化されたステートメントを実行します。
  • mysqli_stmt_fetch() は結果の行を取得します。

このパラメーター化されたクエリでは、プレースホルダーはバインドされた値に置き換えられるため、悪意のある入力の挿入を防ぎます。さらに、セキュリティを強化するにはパスワードを暗号化またはハッシュ化し、平文パスワードの保存を避けることが不可欠です。パラメーター化されたクエリを採用することで、PHP 開発者は Web アプリケーションを SQL インジェクション攻撃から効果的に保護できます。

以上がPHP のパラメータ化されたクエリは SQL インジェクションからどのように保護されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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