PHP 開発で SQL インジェクション攻撃を防ぐ方法
SQL インジェクション攻撃とは、Web アプリケーションで SQL ステートメントを動的に構築し、データベース上でこれらの SQL ステートメントを実行することを指し、攻撃者が悪意のある操作を実行できるようにします。機密データを取得する方法。この攻撃手法に対して、開発者は Web アプリケーションのセキュリティを確保するための保護措置を講じる必要があります。この記事では、PHP開発におけるSQLインジェクション攻撃を防ぐ方法を紹介します。
PHP では、PDO または mysqli 拡張ライブラリを使用してパラメータ バインドを実装し、SQL ステートメントと入力パラメータを個別に実行できます。この方法により、パラメータに SQL 例外文字やステートメントが含まれることを防ぎ、内部 SQL インジェクション攻撃を回避できます。
PDO を例にとると、コードは次のとおりです。
//准备SQL语句 $sql = "SELECT name, age, email FROM user WHERE id = :id AND age > :age"; $stmt = $pdo->prepare($sql); //绑定参数 $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->bindParam(':age', $age, PDO::PARAM_INT); //执行查询语句 $stmt->execute();
ユーザー入力データをデータベースに保存する前に、次のことが必要です。エスケープ関数を使用して文字列をエスケープします。 PHP では、mysql_real_escape_string() 関数と mysqli_real_escape_string() 関数でエスケープを実現できます。この方法は低レベルの予防策であり、他のより安全な保護策と組み合わせて使用することをお勧めします。
コード例:
//获取用户输入 $username = $_POST['username']; $password = $_POST['password']; //转义字符串 $username = mysql_real_escape_string($username); $password = mysql_real_escape_string($password); //准备SQL,然后查询 $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; mysql_query($sql);
入力チェックとは、入力が正当で期待を満たしていることを確認するために入力パラメータをフィルタリングおよび検証することを指します。そしてフォーマットします。このアプローチにより、潜在的な SQL インジェクションの脆弱性が回避されます。たとえば、クエリのパラメータが数値の場合、is_numeric() 関数を使用して、それが数値であるかどうかを確認できます。クエリのパラメータが文字列の場合、 ctype_alpha() 関数を使用して、文字のみが含まれているかどうかを確認できます。
//对用户输入进行检查 if (is_numeric($_GET['id'])) { $id = $_GET['id']; //查询数据库 $sql = "SELECT * FROM users WHERE id = $id"; mysql_query($sql); }
Web アプリケーションを開発する場合、特定のアカウントと権限を使用してデータベースに接続できます。アカウントと権限を設定するときは、必要なデータと操作のみが許可されるように慎重に検討する必要があります。たとえば、読み取り専用アカウントは INSERT、UPDATE、DELETE 操作を実行できないため、SQL インジェクション攻撃のリスクが大幅に軽減されます。
概要:
この記事では、PHP 開発における SQL インジェクション攻撃を防ぐ 4 つの方法 (パラメーター バインド、文字列エスケープ、入力チェック、データベース アクセス許可制御など) を紹介します。開発者は、アプリケーションのシナリオと Web アプリケーションのセキュリティを確保する必要性に基づいて、適切な保護手段を選択する必要があります。同時に、PHPのバージョンアップやデータベースソフトウェアの適時更新もSQLインジェクション攻撃を防ぐ有効な手段となります。
以上がPHP開発におけるSQLインジェクション攻撃を防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。