ホームページ >バックエンド開発 >PHPチュートリアル >プリペアド ステートメントは PHP アプリケーションでの SQL インジェクション攻撃をどのように防ぐことができますか?

プリペアド ステートメントは PHP アプリケーションでの SQL インジェクション攻撃をどのように防ぐことができますか?

DDD
DDDオリジナル
2024-12-21 16:46:10708ブラウズ

How Can Prepared Statements Prevent SQL Injection Attacks in PHP Applications?

PHP での SQL インジェクション攻撃の防止

Web アプリケーションでは、ユーザー入力が処理されないと SQL インジェクションなどの脆弱性を引き起こす可能性があります。きちんと。 SQL インジェクションは、ユーザーが指定したデータが適切な検証やサニタイズを行わずに SQL ステートメントに直接組み込まれた場合に発生します。

問題

次の PHP コード スニペットを考えてみましょう:

$unsafe_variable = $_POST['user_input'];

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");

ユーザーが value') のような悪意のあるデータを入力した場合。 DROP TABLE table;--、SQL クエリは次のようになります。

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

これにより、悪意のあるユーザーがデータベースからテーブル全体を削除します。

解決策: 準備されたステートメントとパラメータ化

SQL インジェクションを防ぐために推奨される解決策は、準備されたステートメントとパラメータ化されたステートメントを使用して SQL からデータを分離することです。クエリ。これにより、ユーザー入力が実行可能コマンドとしてではなく、データとして扱われることが保証されます。

PDO の使用

PDO は、さまざまなデータベース ドライバーに一貫した汎用インターフェイスを提供します。 PDO でプリペアドステートメントを使用するには:

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(['name' => $name]);

foreach ($stmt as $row) {
    // Do something with $row
}

MySQLi の使用

特に MySQL の場合、MySQLi は PHP 8.2 でexecute_query() メソッドを提供します。

$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }

または、以前の PHP バージョンでは8.2:

$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' specifies the variable type as string
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }

他のデータベース ドライバーについては、それぞれのドキュメントを参照してください。

適切な接続セットアップ

真の保護を確保するには、これが重要ですデータベース接続を構成するには正しく:

PDO

エミュレートされた準備済みステートメントを無効にする:

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

MySQLi

エラーを有効にするレポートとキャラクターの設定set:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4');

説明

準備されたステートメントはデータベース サーバーによって解析およびコンパイルされますが、パラメーターは別個の値として扱われます。これにより、悪意のある入力がコマンドとして解釈されるのを防ぎます。

結論

プリペアド ステートメントとパラメータ化を採用することで、PHP Web アプリケーションを SQL インジェクション攻撃から効果的に保護し、維持することができます。データの整合性。

以上がプリペアド ステートメントは PHP アプリケーションでの SQL インジェクション攻撃をどのように防ぐことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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