現在の位置: ホーム> 最新記事一覧> PHP形態のSQL注入攻撃を効果的に防止する方法は?最良の保護方法の分析

PHP形態のSQL注入攻撃を効果的に防止する方法は?最良の保護方法の分析

M66 2025-07-07

SQL注射攻撃をPHP形式で防ぐ方法は?

SQLインジェクション攻撃は一般的であり、Web開発におけるセキュリティの脆弱性を非常に脅かしています。攻撃者は、この脆弱性を悪用して悪意のあるコードをデータベースに注入し、それによりデータベースの整合性を破壊したり、機密情報を漏らしたりします。 PHPフォーム処理では、SQLインジェクション攻撃を効果的に防止するための鍵は、ユーザーが入力したデータを厳密にフィルタリングしてエンコードすることです。この記事では、SQLインジェクション攻撃を防ぎ、コードの例と組み合わせてソリューションを提供する方法を詳細に説明します。

前処理ステートメントを使用したSQL注入を防ぎます

前処理ステートメントは、SQL statementをデータベースサーバーに解析してコンパイルするために、SQL注入を効果的に防ぐことができるテクノロジーです。パラメーター化されたクエリを介してユーザー入力データをSQLステートメントから分離し、悪意のあるデータの注入を回避します。 PHPでは、PDOは便利な前処理ステートメント機能を提供し、以下は実装の例です。

 // データベースに接続します
$dsn = 'mysql:host=localhost;dbname=test';
$username = 'root';
$password = 'password';

try {
    $pdo = new PDO($dsn, $username, $password);
    // エラーモードを例外に設定します
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo 'データベース接続に失敗しました:' . $e->getMessage();
}

// 準備するSQL声明
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');

// バインドパラメーター
$stmt->bindParam(':username', $username);

// クエリを実行します
$stmt->execute();

// 結果を取得します
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 出力結果
foreach ($result as $row) {
    echo $row['username'];
}

このコードでは、最初に、SQLクエリステートメントはprepare()メソッドを使用して作成され、プレースホルダー:ユーザー名はユーザーが入力したユーザー名の代わりに使用されます。実際のユーザー名はBindParam()メソッドを介してプレースホルダーにバインドされ、クエリが最終的に実行され、ユーザーデータの挿入をSQLステートメントに直接挿入します。

フィルタリング機能を使用して、データセキュリティを強化します

PHPは、特にSQLインジェクション攻撃をトリガーする可能性のある特殊文字やSQLキーワードを削除するために、ユーザー入力データをクリーニングおよびフィルタリングするためのさまざまなフィルタリング機能を提供します。 mysqli_real_escape_string()は、ユーザーが入力した文字列を脱出し、SQLステートメントに対する特殊文字の影響を回避するのに役立つ一般的に使用されるフィルタリング機能です。この関数を使用したコード例は次のとおりです。

 // データベースに接続します
$servername = 'localhost';
$username = 'root';
$password = 'password';
$dbname = 'test';

$conn = mysqli_connect($servername, $username, $password, $dbname);

// 接続が成功しているかどうかを確認してください
if (!$conn) {
    die('データベース接続に失敗しました: ' . mysqli_connect_error());
}

// ユーザー入力データをフィルターします
$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

// クエリを実行します
$sql = "SELECT * FROM users WHERE username = '{$username}' AND password = '{$password}'";
$result = mysqli_query($conn, $sql);

// 処理結果
if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        echo 'ユーザー名はです: ' . $row['username'];
    }
} else {
    echo '間違ったユーザー名またはパスワード';
}

// 接続を閉じます
mysqli_close($conn);

MySQLI_REAL_ESCAPE_STRING()関数を介して、ユーザーが入力したユーザー名とパスワードをフィルタリングし、実行される特殊文字またはSQLキーワードを避けて、SQLインジェクション攻撃を防ぎます。

要約します

PHP形式のSQL注入攻撃を防ぐには多くの方法があり、最も一般的で効果的な戦略には、前処理ステートメントとフィルタリング機能の使用が含まれます。いずれにせよ、ユーザーが入力したすべてのデータが、ウェブサイトのセキュリティを確保するために厳密にフィルタリングおよびエンコードされるようにすることが重要です。また、開発者は定期的なセキュリティレビューと脆弱性スキャンを実施して、可能なセキュリティリスクを迅速に修正し、ユーザーデータとウェブサイト情報を保護する必要があります。