Webアプリケーションの開発では、特にアプリケーションにデータベース操作が含まれる場合、データのフィルタリングと検証がセキュリティを確保するための重要な手順です。 SQL注入攻撃を防ぐ方法は、開発者が注意を払わなければならない重要な問題です。この記事では、開発者がSQLインジェクション攻撃を効果的に防止できるように、いくつかの一般的なPHPデータフィルタリング方法を導入します。
前処理ステートメントは、SQLインジェクション攻撃を防ぐための効果的な方法であり、SQLクエリステートメントをデータパラメーターとは別に実行するため、SQLステートメントを持つユーザーが入力した悪意のあるデータをスプライシングするリスクを回避します。 PHPでは、PDO(PHPデータオブジェクト)またはMySQLI(MySQL改善拡張)を使用して、前処理ステートメントを実装できます。
これは、PDO前処理ステートメントを使用したコード例です。
// 作成する PDO 接続する
$pdo = new PDO('mysql:host=localhost;dbname=mydb;charset=utf8', 'username', 'password');
<p>// 前処理ステートメントを準備します<br>
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');</p>
<p>// バインドパラメーター<br>
$stmt->bindParam(':username', $username);</p>
<p>// クエリを実行します<br>
$stmt->execute();</p>
<p>// 結果を取得します<br>
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);<br>
PHPは、 filter_input()やfilter_var()など、ユーザー入力データをフィルタリングするためのさまざまな内蔵機能を提供します。これらの機能は、指定されたフィルターに基づいて入力データを検証およびクリーニングし、SQLインジェクション攻撃を効果的に防止できます。
filter_input()とfilter_var()を使用したコード例は次のとおりです。
// 使用 filter_input() 入力データをフィルターします
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
<p>// 使用 filter_var() 入力データをフィルターします<br>
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);<br>
ユーザーが入力したデータをSQLステートメントに挿入する場合、特殊文字を逃れる必要があります。 PHPは、この問題を処理するために、 addSlashes()およびmysqli_real_escape_string()機能を提供します。
mysqli_real_escape_string()を使用して、特殊文字を逃れるためのコード例を示します。
// 作成する mysqli 接続する
$conn = mysqli_connect('localhost', 'username', 'password', 'mydb');
<p>// 特殊文字を逃がします<br>
$username = mysqli_real_escape_string($conn, $_POST['username']);<br>
$password = mysqli_real_escape_string($conn, $_POST['password']);</p>
<p>// 埋め込む SQL クエリ<br>
$query = "INSERT INTO users (username, password) VALUES('$username', '$password')";<br>
mysqli_query($conn, $query);<br>
プリプロセシングステートメント、フィルタリング機能、特殊文字の脱出を使用することにより、開発者はSQL注入攻撃を効果的に防ぐことができます。ただし、ハッカーは常に新しい攻撃方法を探しているため、ソフトウェアを時間内に更新し、潜在的な脆弱性を修正することも重要です。したがって、開発者は、アプリケーションのセキュリティを確保するために、コードに関するセキュリティレビューを定期的に実施する必要があります。
要するに、Web開発者は、ユーザー入力を処理する際にデータのセキュリティを非常に重要視する必要があります。正しいフィルタリングおよび検証方法を使用すると、アプリケーションのセキュリティを強化するだけでなく、SQL注入のリスクを大幅に減らします。うまくいけば、この記事がSQL注射の防止に関するPHP開発者に有用なアドバイスを提供することを願っています。