SQL インジェクション攻撃から PHP アプリケーションを保護する

DDD
リリース: 2024-09-14 06:23:36
オリジナル
1263 人が閲覧しました

Securing PHP Applications Against SQL Injection Attacks

SQL インジェクション攻撃をブロックすることは、PHP アプリケーションのセキュリティを維持するために重要です。 SQL インジェクションは、攻撃者がデータベース上で任意の SQL コードを実行できるようにする脆弱性であり、データ侵害や損失につながる可能性があります。ここでは、PHP での SQL インジェクション攻撃を防ぐためのステップバイステップのガイドを、実際の例と説明を含めて説明します。

1. 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 テーブルからすべての行を返します。

2.準備済みステートメントを使用する

プリペアド ステートメントは、SQL インジェクションに対する重要な防御策です。 SQL ロジックをデータから分離し、ユーザー入力が実行可能コードではなくデータとして扱われるようにします。

プリペアドステートメントでの MySQLi の使用:

  1. データベースに接続します:
   $conn = new mysqli("localhost", "username", "password", "database");

   if ($conn->connect_error) {
       die("Connection failed: " . $conn->connect_error);
   }
ログイン後にコピー
  1. SQL ステートメントを準備します:
   $stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
ログイン後にコピー
  1. バインドパラメータ:
   $stmt->bind_param("i", $user_id); // "i" indicates the type is integer
ログイン後にコピー
  1. ステートメントを実行します:
   $user_id = $_GET['user_id'];
   $stmt->execute();
ログイン後にコピー
  1. 結果のフェッチ:
   $result = $stmt->get_result();
   while ($row = $result->fetch_assoc()) {
       // Process results
   }
ログイン後にコピー
  1. ステートメントと接続を閉じます:
   $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();
?>
ログイン後にコピー

3.プリペアドステートメントで PDO を使用する

PHP データ オブジェクト (PDO) は、SQL インジェクションに対する同様の保護を提供し、複数のデータベース システムをサポートします。

プリペアドステートメントでの PDO の使用:

  1. データベースに接続します:
   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());
   }
ログイン後にコピー
  1. SQL ステートメントを準備します:
   $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
ログイン後にコピー
  1. パラメータをバインドして実行:
   $stmt->bindParam(':id', $user_id, PDO::PARAM_INT);
   $user_id = $_GET['user_id'];
   $stmt->execute();
ログイン後にコピー
  1. 結果のフェッチ:
   $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()); } ?>
ログイン後にコピー

4.追加のセキュリティ対策

  • 入力のサニタイズ: ユーザー入力を常にサニタイズおよび検証して、期待される形式であることを確認します。
  • ORM を使用する: Eloquent (Laravel) のようなオブジェクト リレーショナル マッパーは、SQL インジェクション保護を内部で処理します。
  • データベース権限を制限する: データベース ユーザー アカウントには最小権限の原則を使用します。

5.結論

SQL インジェクション攻撃をブロックすることは、PHP アプリケーションを保護するために重要です。 MySQLi または PDO でプリペアド ステートメントを使用すると、ユーザー入力が安全に処理され、SQL クエリの一部として実行されないようになります。これらのベスト プラクティスに従うと、最も一般的な Web 脆弱性の 1 つからアプリケーションを保護できます。

以上がSQL インジェクション攻撃から PHP アプリケーションを保護するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!