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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-29 10:54:02606ブラウズ

How Do Parameterized Queries Protect Against SQL Injection?

安全なデータベース相互作用のためのパラメータ化されたクエリの使用

SQL インジェクションは依然として重大なセキュリティ上の脅威であり、攻撃者がユーザーが送信した入力を使用して悪意のあるクエリを実行することを可能にします。 。 Web サイトを保護するために、パラメーター化されたクエリは堅牢なソリューションを提供します。ただし、それらを統合するには、適切なデータベース接続処理が必要です。

次のログイン ページ コードの例を考えてみましょう:

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

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

$result = mysqli_query($dbc, $query); //$dbc is for MySQL connection: $dbc = @mysqli_connect($dbhost, $dbuser, $dbpass, $db)

$row = mysqli_fetch_array($result);

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

パラメータ化されたクエリの実装:

SQL インジェクション。このコードを次のように置き換えます。

<code class="php">$stmt = mysqli_prepare($dbc, "SELECT * FROM users WHERE username = ? AND password = ?");

mysqli_stmt_bind_param($stmt, "ss", $userName, $userPass);

mysqli_stmt_execute($stmt);

$row = mysqli_stmt_fetch($stmt);</code>
  • mysqli_prepare(): パラメーター化されたクエリ ステートメントを準備します。
  • mysqli_stmt_bind_param(): 入力値をプレースホルダー (?) にバインドします。
  • mysqli_stmt_execute(): 準備されたクエリを実行します。
  • mysqli_stmt_fetch(): result row.

接続処理:

元のコードでは、データベースへの接続は mysqli_connect() を使用して確立されます。これはクエリを実行する前に行う必要があります。続行する前に、有効な $dbc があることを確認してください。

セキュリティのベスト プラクティス:

  • パスワードをデータベースに保存する前にハッシュまたは暗号化します。
  • ユーザー入力を検証して、悪意のある文字を防止します。
  • ユーザーが提供したデータを含むすべてのデータベース対話に対して、準備されたステートメントを一貫して使用します。

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

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