SQL インジェクションは、攻撃者がデータベース クエリを操作し、機密データを侵害する可能性があるため、Web アプリケーションにとって依然として大きな脅威です。この脆弱性を防ぐ方法を理解することは、データベースの整合性を保護するために非常に重要です。
SQL インジェクションに対する最も効果的な解決策は、データを SQL コマンドから分離しておくことです。データは生の入力として扱われ、データベース サーバーによるコマンドとして解釈されることは決して許可されません。これは、プリペアド ステートメントとパラメータ化されたクエリを使用することで実現でき、次のような利点があります。
PDO (サポートされているすべてのデータベースの場合) または MySQLi (MySQL の場合) でプリペアド ステートメントを使用すると、SQL を防止するための堅牢なメカニズムが提供されます。インジェクション:
PDO:
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(['name' => $name]);
MySQLi:
$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute();
正しい機能を保証するには、PDO と MySQLi には特定のものが必要です構成:
PDO:
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbConnection->set_charset('utf8mb4');
MySQLi:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $dbConnection->set_charset('utf8mb4');
プリペアドステートメントは SQL インジェクションを防ぐだけでなく、追加の機能を提供します利点:
プリペアド ステートメントはパラメータ化をサポートしていますが、クエリ構造を動的に変更するために使用することはできません。これらのシナリオには、ホワイトリスト フィルターなどの代替アプローチをお勧めします。
以上がPHP のプリペアド ステートメントは SQL インジェクション攻撃を効果的に防ぐにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。