ホームページ  >  記事  >  バックエンド開発  >  PHP および CGI での SQL インジェクション攻撃を防ぐためのヒントと対策

PHP および CGI での SQL インジェクション攻撃を防ぐためのヒントと対策

PHPz
PHPzオリジナル
2023-07-22 22:49:571659ブラウズ

SQL インジェクション攻撃を防ぐための PHP および CGI のヒントと対策

ネットワーク テクノロジの発展に伴い、Web アプリケーションは私たちの生活の中でますます重要な役割を果たしています。しかし、これに伴うネットワーク セキュリティの問題がますます顕著になってきています。その中でも SQL インジェクション攻撃は最も一般的で破壊的な攻撃手法です。この記事では、PHP および CGI における SQL インジェクション攻撃を防ぐための技術と対策について説明し、関連するコード例を示します。

1. SQL インジェクション攻撃とは何ですか?
SQL インジェクション攻撃とは、Web アプリケーションの脆弱性を悪用する一種で、ユーザーが入力したデータに悪意のある SQL コードを挿入することで、データベースに不正アクセスされる可能性があります。操作とアクセス。このようにして、攻撃者は機密データを取得したり、データベースの内容を変更したり、これを利用してシステム全体を制御したりすることさえできます。

2. SQL インジェクション攻撃を防ぐためのヒントと対策

  1. プリコンパイルされたステートメントを使用する
    プリコンパイルされたステートメントは、SQL ステートメントを実行する前に入力データを SQL ステートメントにバインドする方法です。特定のパラメータ。これにより、入力されたデータはパラメータとしてのみ扱われ、SQL コードの一部として実行されなくなります。 PHP では、PDO (PHP Data Objects) または MySQLi 拡張機能を使用してプリペアド ステートメントを実装できます。

例 1: プリコンパイルされたステートメントに PDO を使用する

// 建立与数据库的连接
$pdo = new PDO("mysql:host=localhost;dbname=database", "user", "password");

// 准备预编译语句
$statement = $pdo->prepare("SELECT * FROM users WHERE username = :username");

// 绑定参数
$statement->bindParam(':username', $username, PDO::PARAM_STR);

// 执行查询
$statement->execute();

// 获取查询结果
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
  1. パラメーター化されたクエリの使用
    パラメーター化されたクエリは、SQL ステートメントとパラメーターを分離する方法です。入力された内容はコードの一部ではなくデータとして扱われます。 CGI では、Perl の DBI モジュールを使用してパラメータ化されたクエリを実装できます。

例 2: Perl の DBI モジュールを使用したパラメータ化されたクエリ

use DBI;

# 建立与数据库的连接
my $dbh = DBI->connect("DBI:mysql:database=database;host=localhost", "user", "password");

# 准备参数化查询语句
my $sth = $dbh->prepare("SELECT * FROM users WHERE username = ?");

# 绑定参数
$sth->execute($username);

# 获取查询结果
my $result = $sth->fetchrow_hashref();
  1. ユーザー入力のフィルタリングと検証
    ユーザー入力は、特定の Type データのみを許可するようにフィルタリングおよび検証する必要があります。が渡され、特殊文字を含む入力は拒否されます。 PHP では、filter_var() 関数を使用してフィルタリングと検証を行うことができます。

例 3: filter_var() 関数を使用してユーザー入力をフィルター処理する

// 过滤和验证用户输入
$username = $_POST['username'];

if (!filter_var($username, FILTER_VALIDATE_INT)) {
    echo "Invalid username";
}

// 对用户输入进行SQL查询
$query = "SELECT * FROM users WHERE username = " . $username;
$result = mysqli_query($connection, $query);
  1. 防御的プログラミングの使用
    防御的プログラミングとは、プログラミング中に予測と予測を行う方法です。潜在的な攻撃手法を防ぐためのプロセス技術。コードを記述するときは、考えられる攻撃シナリオを考慮し、これらの攻撃を防ぐための適切な措置を講じてください。たとえば、入力を厳密に制限して検証し、機密データを暗号化および復号化し、ページに詳細なエラー メッセージを表示しないようにします。

例 4: 防御的プログラミングを使用してユーザー入力を処理する

# 处理用户输入
username = input("Enter your username: ")

# 验证用户输入是否包含特殊字符
if not username.isalnum():
    print("Invalid username")

# 在SQL查询中使用用户输入
query = "SELECT * FROM users WHERE username = %s" % username
result = cursor.execute(query)

概要:
SQL インジェクション攻撃は、Web アプリケーションにおける最も一般的で破壊的な攻撃手段です。このような攻撃からアプリケーションを保護するために、実行できるヒントと対策がいくつかあります。この記事では、プリペアド ステートメントの使用、パラメータ化されたクエリ、ユーザー入力のフィルタリングと検証、防御的プログラミングについて説明します。これらのテクノロジーはすべて、データベースとシステムのセキュリティを保護するのに役立ちます。しかし、実際の応用においては、新たなセキュリティの脆弱性や攻撃手法にも常に注意を払い、防御策を常に更新、改善していく必要があります。

以上がPHP および CGI での SQL インジェクション攻撃を防ぐためのヒントと対策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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