ホームページ  >  記事  >  バックエンド開発  >  PHP ファイルへの SQL インジェクション攻撃を回避するにはどうすればよいですか?

PHP ファイルへの SQL インジェクション攻撃を回避するにはどうすればよいですか?

PHPz
PHPzオリジナル
2023-05-22 08:42:05938ブラウズ

インターネット技術の継続的な発展に伴い、Web サイトやアプリケーションのセキュリティ問題への注目がますます高まっています。中でも SQL インジェクション攻撃は、特に PHP で書かれた Web サイトやアプリケーションに対して一般的な攻撃手法です。そこでこの記事では、Webサイトやアプリケーションのセキュリティを確保するために、PHPファイルへのSQLインジェクション攻撃を回避する方法を紹介します。

  1. 準備されたステートメントを使用する

準備されたステートメントは、SQL インジェクション攻撃を防ぐ重要な方法です。 SQL ステートメントとパラメータを分離することで、不適切な入力による攻撃の可能性を回避します。 PHP で一般的に使用されるプリペアド ステートメントには、PDO や MySQLi などがあります。次に、PDO の使用例を示します。

//连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
//预处理SQL语句
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password');
//绑定参数
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
//执行查询
$stmt->execute();
  1. パラメータ化されたクエリ

パラメータ化されたクエリは準備されたステートメントに似ており、SQL ステートメントとパラメータも分離されています。違いは、パラメーター化されたクエリでは、プレースホルダーを使用して SQL ステートメント内のパラメーターを置き換え、パラメーターをクエリ関数に個別に渡すことを指します。 MySQLi を使用した例を次に示します。

//连接数据库
$conn = mysqli_connect('localhost', 'username', 'password', 'test');
//参数化查询
$stmt = mysqli_prepare($conn, 'SELECT * FROM users WHERE username = ? AND password = ?');
mysqli_stmt_bind_param($stmt, 'ss', $username, $password);
mysqli_stmt_execute($stmt);
  1. 入力のフィルタリング

ユーザー入力は、SQL クエリ条件として使用される前に適切にフィルタリングされ、検証される必要があります。 PHP で一般的に使用されるフィルタリング関数には、HTML タグと特殊文字をフィルタリングできる htmlspecialchars() およびstrip_tags() があります。例:

//使用htmlspecialchars()过滤用户输入
$username = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8');
$password = htmlspecialchars($_POST['password'], ENT_QUOTES, 'UTF-8');
//查询用户
$stmt = $pdo->query("SELECT * FROM users WHERE username = '{$username}' AND password = '{$password}'");
  1. 変数タイプの確認

ユーザー入力を SQL クエリ条件として使用する前に、変数のタイプが正しいかどうかも確認する必要があります。たとえば、ユーザー入力が文字列の場合は引用符で囲む必要がありますが、ユーザー入力が数値の場合は引用符で囲む必要はありません。 PHP で一般的に使用される型チェック関数には is_numeric() および is_string() があり、変数が数値であるか文字列であるかをチェックするのに役立ちます。例:

$username = $_POST['username'];
if (is_string($username)) {
    //将字符串用引号括起来
    $username = "'" . $username . "'";
}
$password = $_POST['password'];
if (is_string($password)) {
    //将字符串用引号括起来
    $password = "'" . $password . "'";
}
//查询用户
$stmt = $pdo->query("SELECT * FROM users WHERE username = {$username} AND password = {$password}");

つまり、SQL インジェクション攻撃は危険で一般的な攻撃手法であり、それを防ぐためには効果的な対策を講じる必要があります。この記事では、準備されたステートメント、パラメータ化されたクエリ、入力のフィルタリング、変数の型のチェックなど、SQL インジェクション攻撃を回避するためのいくつかの方法を紹介しますので、PHP 開発者の参考になれば幸いです。

以上がPHP ファイルへの SQL インジェクション攻撃を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。