ホームページ >データベース >mysql チュートリアル >準備されたステートメントとパラメーター化されたクエリは、PHPアプリケーションでのSQL注入をどのように防ぐことができますか?

準備されたステートメントとパラメーター化されたクエリは、PHPアプリケーションでのSQL注入をどのように防ぐことができますか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-25 22:22:09449ブラウズ

How Can Prepared Statements and Parameterized Queries Prevent SQL Injection in PHP Applications?

はじめに

SQLインジェクションは、SQLクエリ内のユーザー入力を処理するアプリケーションにとって重要な脅威のままです。 攻撃者は脆弱性を活用して悪意のあるコマンドを注入し、データベース全体を侵害する可能性があります。この記事では、PHPでのSQL注入を防ぐための堅牢な方法について詳しく説明しています。

SQL注入脅威を理解する

未検証のユーザー入力がSQLクエリに直接影響する場合、SQLインジェクションエクスプロイトが発生します。 たとえば、

のような悪意のあるコードが含まれている場合、データベースはこの破壊的なコマンドを実行します。

<code class="language-php">$userInput = $_POST['user_input'];
mysql_query("INSERT INTO users (username) VALUES ('$userInput')");</code>
効果的な予防戦略

$userInput '; DROP TABLE users; --

1。 準備されたステートメントとパラメーター化されたクエリ:防衛の礎

コア原則は、SQLクエリ構造からデータを分離することです。準備されたステートメント(またはパラメーター化されたクエリ)は、次のことでこれを達成します

クエリ/データ分離:データベースサーバーは、データ値とは独立してSQLクエリを解析します。 文字列としてのデータ:

データ:すべてのデータは、悪意のあるSQLコードを中和する文字通り文字列として扱われます。

PDO(PHPデータオブジェクト)を使用する

    :推奨されるアプローチ
  • PDOは、異なるデータベースシステム全体で一貫したインターフェイスを提供します。 準備されたステートメントでPDOを使用する方法は次のとおりです
  • mysqli(mysqlの改善):mysql
  • の代替
mysqliは、パラメーター化されたクエリを実行する2つの方法を提供します:

(php 8.2以降):

<code class="language-php">$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(['name' => $name]);

foreach ($stmt as $row) {
    // Process each row
}</code>

および

execute_query()2。 データベース接続のベストプラクティス

<code class="language-php">$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
    // Process each row
}</code>

pdo:prepare() execute()最適なセキュリティのためにエミュレートされた準備されたステートメントを無効にします:

<code class="language-php">$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' denotes a string parameter
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // Process each row
}</code>

mysqli:

堅牢なエラー報告を有効にして、文字セットを指定します:

3。 追加のセキュリティ上の考慮事項

<code class="language-php">$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);</code>

ダイナミッククエリ:準備されたステートメントがデータパラメーターを処理する間、クエリ構造自体をパラメーター化することはできません。動的クエリの場合、許可された値を制限するためにホワイトリストを使用してください

結論

<code class="language-php">mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$dbConnection = new mysqli('localhost', 'username', 'password', 'database');
$dbConnection->set_charset('utf8mb4');</code>
準備されたステートメントを実装し、データベース接続のフォローするベストプラクティスは、SQLインジェクションからPHPアプリケーションを保護するために重要です。 SQLクエリ内のデータ分離の優先順位付けにより、データベースの整合性とアプリケーションセキュリティが保証されます。

以上が準備されたステートメントとパラメーター化されたクエリは、PHPアプリケーションでのSQL注入をどのように防ぐことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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