ホームページ >データベース >mysql チュートリアル >プリペアドステートメントはどのようにして SQL インジェクションを防ぐのでしょうか?

プリペアドステートメントはどのようにして SQL インジェクションを防ぐのでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-20 22:57:08398ブラウズ

How Do Prepared Statements Prevent SQL Injection?

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

プリペアド ステートメントは、SQL インジェクションを防止するためのプロアクティブなアプローチを提供します。 これは、ユーザーが指定したデータを SQL クエリ構造から分離することで実現されます。 ユーザー入力をクエリ文字列に直接埋め込む代わりに、準備されたステートメントは、通常は疑問符 (?) で表されるパラメーターをプレースホルダーとして使用します。

データベース エンジンは、ユーザー データが追加されるにプリペアド ステートメントを解析してコンパイルします。 この重要な手順により、ユーザー入力がデータとしてのみ扱われ、実行可能な SQL コードとして解釈されることがなくなります。これは、ユーザー入力を SQL 文字列に直接連結する脆弱な方法とは明らかに対照的です。

説明例: ユーザー データをデータベースに挿入することを検討してください。

脆弱な文字列連結:

<code class="language-java">PreparedStatement stmt = conn.createStatement("INSERT INTO students VALUES('" + user + "')");
stmt.execute();</code>

安全なプリペアドステートメント:

<code class="language-java">PreparedStatement stmt = conn.prepareStatement("INSERT INTO student VALUES(?)");
stmt.setString(1, user);
stmt.execute();</code>

悪意のあるユーザーが入力した場合: Robert'); DROP TABLE students; --

文字列連結メソッドの結果は次のとおりです。

<code class="language-sql">INSERT INTO students VALUES('Robert'); DROP TABLE students; --')</code>

これにより、悪意のある DROP TABLE コマンドが実行されます。

ただし、準備されたステートメントを使用すると、データベースは次のように実行されます。

<code class="language-sql">INSERT INTO student VALUES('Robert');</code>

悪意のある入力はリテラル データとして扱われ、SQL インジェクションの脅威が無力化されます。 プリペアド ステートメントは、潜在的に有害なユーザー入力からクエリのロジックを効果的に分離し、SQL コマンドの整合性を保証します。

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

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