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

MySQL を使用した PHP のパラメータ化されたクエリは SQL インジェクション攻撃からどのように保護できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-28 19:03:02628ブラウズ

How can Parameterized Queries in PHP with MySQL protect against SQL Injection Attacks?

安全な PHP-MySQL 接続のためのパラメータ化されたクエリ

SQL インジェクションは、Web アプリケーションに対する重大なセキュリティ脅威を表します。攻撃者は SQL クエリを操作することで、機密データに不正にアクセスしたり、データベース操作を妨害したりする可能性があります。パラメータ化されたクエリは、この脆弱性を軽減する効果的な対策を提供します。

MySQL を使用して PHP でパラメータ化されたクエリを準備する方法を示すログイン ページのコードのスニペットです。

<code class="php">$dbc = @mysqli_connect($dbhost, $dbuser, $dbpass, $db); // MySQL connection

$userName = $_POST["username"];
$userPass = $_POST["password"];

$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);

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

このコードmysqli_connect を使用して MySQL データベースへの接続を確立し、接続識別子を $dbc に割り当てます。 $userName 変数と $userPass 変数は、ログイン ページでユーザーが入力したユーザー名とパスワードを受け取ります。

mysqli_prepare 関数は、準備されたステートメントを初期化します。実行される SQL クエリは最初の引数として渡されます。この場合、ユーザー名とパスワードの両方が入力パラメーターに一致するすべての行を users テーブルから取得します。

次に、mysqli_stmt_bind_param を使用してユーザー提供の入力パラメーター $userName と $userPass をバインドします。準備されたステートメント内のプレースホルダー (?)。このコードでは、両方のパラメーターのデータ型が s (文字列) であることを指定しています。

mysqli_stmt_execute 関数は、準備されたステートメントを実行します。

最後に、mysqli_stmt_fetch は結果セットから最初の行を取得し、それを$row 変数。

このコードはパラメータ化されたクエリを使用することで、悪意のある SQL ステートメントが実行できないようにし、SQL インジェクション攻撃から保護します。

セキュリティを強化するには、暗号化することを強くお勧めします。または、ユーザーのパスワードをデータベースに保存する前にハッシュ化します。

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

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