PHP フォームでの SQL インジェクション攻撃を防ぐにはどうすればよいですか?
SQL インジェクション攻撃は、Web 開発において非常に一般的で危険なセキュリティ脆弱性です。攻撃者はこの脆弱性を利用して悪意のあるコードをデータベースに挿入し、データベースの整合性を破壊し、さらには機密情報を取得します。 PHP フォームでは、SQL インジェクション攻撃を防ぐ主な方法は、ユーザーが入力したデータを厳密にフィルタリングしてエンコードすることです。この記事では、SQL インジェクション攻撃を防ぐ方法をコード例とともに詳しく説明します。
1. プリペアド ステートメントを使用する
プリプロセス ステートメントは、SQL ステートメントをデータベース パーサーに送信して、実行前にコンパイルと解析を行うテクノロジーです。パラメーター化されたクエリを使用してユーザーが入力したデータを 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']; }
上記のコードでは、パラメータを使用する prepare()
メソッドを通じて SQL ステートメントを準備します。 :username
は、ユーザーが入力したユーザー名を置き換えます。次に、実際のユーザー名が bindParam()
メソッドを通じてパラメータにバインドされ、最後にクエリが実行されて結果が取得されます。この方法では、ユーザー入力がどのようなものであっても、SQL ステートメントには影響しません。
2. フィルター関数を使用する
PHP には、ユーザーが入力したデータをフィルター処理およびクリーニングするためのフィルター関数がいくつか用意されています。これらの関数は、入力文字列から特殊文字と SQL キーワードを削除して、SQL インジェクション攻撃を防ぐのに役立ちます。このうち、mysqli_real_escape_string()
はよく使用されるフィルター関数であり、例は次のとおりです:
// 连接数据库 $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 キーワードが含まれている場合でも、それらは SQL インジェクション攻撃を避けるためにエスケープされます。
要約すると、PHP フォームでの SQL インジェクション攻撃を防ぐ方法は数多くありますが、その中でもプリペアド ステートメントとフィルター関数の使用が一般的で効果的な方法です。どの方法を使用する場合でも、Web サイトのセキュリティとデータの整合性を確保するために、ユーザーが入力したデータが厳密にフィルタリングおよびエンコードされていることを確認してください。同時に、開発者は定期的なセキュリティレビューと脆弱性スキャンを実施して、潜在的なセキュリティ脆弱性を迅速に修復し、Web サイトとユーザーの情報セキュリティを保護する必要があります。
以上がPHP フォームでの SQL インジェクション攻撃を防ぐにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。