ホームページ >データベース >mysql チュートリアル >プリペアドステートメントはどのようにして SQL インジェクションを防ぐのでしょうか?
プリペアド ステートメント: 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 サイトの他の関連記事を参照してください。