SQL インジェクション攻撃をブロックすることは、PHP アプリケーションのセキュリティを維持するために重要です。 SQL インジェクションは、攻撃者がデータベース上で任意の SQL コードを実行できるようにする脆弱性であり、データ侵害や損失につながる可能性があります。ここでは、PHP での SQL インジェクション攻撃を防ぐためのステップバイステップのガイドを、実際の例と説明を含めて説明します。
SQL インジェクションは、ユーザー入力が不適切にサニタイズされ、SQL クエリに組み込まれた場合に発生します。たとえば、ユーザーが悪意のある SQL コードを入力すると、クエリが操作されて意図しないアクションが実行される可能性があります。
SQL インジェクションの例:
// Vulnerable Code $user_id = $_GET['user_id']; $query = "SELECT * FROM users WHERE id = $user_id"; $result = mysqli_query($conn, $query);
user_id が 1 OR 1=1 に設定されている場合、クエリは次のようになります。
SELECT * FROM users WHERE id = 1 OR 1=1
1=1 は常に true であるため、このクエリは users テーブルからすべての行を返します。
プリペアド ステートメントは、SQL インジェクションに対する重要な防御策です。 SQL ロジックをデータから分離し、ユーザー入力が実行可能コードではなくデータとして扱われるようにします。
プリペアドステートメントでの MySQLi の使用:
$conn = new mysqli("localhost", "username", "password", "database"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); }
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $user_id); // "i" indicates the type is integer
$user_id = $_GET['user_id']; $stmt->execute();
$result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // Process results }
$stmt->close(); $conn->close();
完全な例:
<?php // Database connection $conn = new mysqli("localhost", "username", "password", "database"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // Prepare statement $stmt = $conn->prepare("SELECT * FROM users WHERE id = ?"); if ($stmt === false) { die("Prepare failed: " . $conn->error); } // Bind parameters $user_id = $_GET['user_id']; $stmt->bind_param("i", $user_id); // Execute statement $stmt->execute(); // Get results $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo "User ID: " . $row['id'] . "<br>"; echo "User Name: " . $row['name'] . "<br>"; } // Close statement and connection $stmt->close(); $conn->close(); ?>
PHP データ オブジェクト (PDO) は、SQL インジェクションに対する同様の保護を提供し、複数のデータベース システムをサポートします。
プリペアドステートメントでの PDO の使用:
try { $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { die("Connection failed: " . $e->getMessage()); }
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(':id', $user_id, PDO::PARAM_INT); $user_id = $_GET['user_id']; $stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "User ID: " . $row['id'] . "<br>"; echo "User Name: " . $row['name'] . "<br>"; }
完全な例:
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Prepare statement $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); // Bind parameters $user_id = $_GET['user_id']; $stmt->bindParam(':id', $user_id, PDO::PARAM_INT); // Execute statement $stmt->execute(); // Fetch results $results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "User ID: " . $row['id'] . "
"; echo "User Name: " . $row['name'] . "
"; } } catch (PDOException $e) { die("Error: " . $e->getMessage()); } ?>
SQL インジェクション攻撃をブロックすることは、PHP アプリケーションを保護するために重要です。 MySQLi または PDO でプリペアド ステートメントを使用すると、ユーザー入力が安全に処理され、SQL クエリの一部として実行されないようになります。これらのベスト プラクティスに従うと、最も一般的な Web 脆弱性の 1 つからアプリケーションを保護できます。
以上がSQL インジェクション攻撃から PHP アプリケーションを保護するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。