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

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

DDD
リリース: 2024-12-21 16:46:10
オリジナル
632 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート