ホームページ > データベース > mysql チュートリアル > PreparedStatement は SQL インジェクションからどのように保護しますか?

PreparedStatement は SQL インジェクションからどのように保護しますか?

Mary-Kate Olsen
リリース: 2025-01-20 22:55:09
オリジナル
503 人が閲覧しました

How Do PreparedStatements Protect Against SQL Injection?

プリペアドステートメント: SQL インジェクションに対する堅牢な防御

SQL インジェクションは依然として重大なセキュリティ脆弱性であり、攻撃者が悪意のある目的でデータベース クエリを操作することを可能にします。 プリペアド ステートメントは、この種の攻撃を効果的に防止する強力なソリューションを提供します。しかし、それらはどのように機能するのでしょうか?

準備されたステートメントはパラメータ化されたクエリを利用します。 ユーザー入力を SQL 文字列に直接埋め込む代わりに、プレースホルダー (「?」など) を使用してテンプレート クエリが作成されます。 実際の値は、setString()setInt() などのメソッドを使用して個別に提供されます。

これは、ユーザー入力を SQL 文字列に直接連結する (例: "INSERT INTO users VALUES('" username "')") とは大きく異なります。 この安全でないアプローチでは、ユーザーによって挿入された悪意のあるコードが、実行されるクエリの一部になります。 たとえば、ユーザーが '; DROP TABLE users; --' を入力すると、テーブルが削除されます。

プリペアド ステートメントは、ユーザーが指定したデータから SQL クエリを厳密に分離することで、このリスクを軽減します。 プレースホルダーは、実行可能な SQL コードとしてではなく、データとして扱われます。 データベース エンジンはパラメーター値を独立して処理し、悪意のあるコードが SQL コマンドの一部として解釈されるのを防ぎます。

例:

次の 2 つのコード スニペットを比較してください:

<code class="language-java">// Vulnerable to SQL injection
Statement stmt = conn.createStatement("INSERT INTO users VALUES('" + username + "')");
stmt.execute();</code>
ログイン後にコピー
<code class="language-java">// Secure using PreparedStatement
PreparedStatement stmt = conn.prepareStatement("INSERT INTO users VALUES(?)");
stmt.setString(1, username);
stmt.execute();</code>
ログイン後にコピー

最初の例は SQL インジェクションの影響を受けやすいです。 2 つ目は、PreparedStatement を使用してクエリ構造をユーザーの username から安全に分離し、SQL インジェクションの試行を無効にします。

要約すると、PreparedStatements の中核的な強みは、SQL クエリからユーザー入力を分離し、SQL インジェクションに対する強力かつ信頼性の高い防御を提供し、データベースの整合性を保護する機能にあります。

以上がPreparedStatement は SQL インジェクションからどのように保護しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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