ホームページ >Java >&#&チュートリアル >PreparedStatement は Java での SQL インジェクションをどのように防ぐことができますか?

PreparedStatement は Java での SQL インジェクションをどのように防ぐことができますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-24 21:54:17864ブラウズ

How Can PreparedStatements Prevent SQL Injection in Java?

SQL インジェクションの防止: Java での文字列のエスケープ

SQL インジェクションを防ぐタスクでは、入力文字列を注意深く処理する必要があります。 1 つのアプローチは、特殊文字の悪用を防ぐために既存の文字列を変更することです。具体的には、既存のバックスラッシュ () を に、引用符 (") を "、アポストロフィ (') を '、改行 (n) を n に変換することで、MySQL データベース クエリで評価される文字列が無害になることが保証されます。

replaceAll 関数はこの変換を実現できますが、バックスラッシュが大量にあるため使用法が複雑になる可能性があります。これに対処するための、より安全な代替方法は、PreparedStatements を利用することです。

PreparedStatements は、ユーザー入力をクエリ ステートメント内のパラメータとして扱うことにより、SQL インジェクションの可能性を排除します。次の Java コード例を考えてみましょう。

public insertUser(String name, String email) {
   Connection conn = null;
   PreparedStatement stmt = null;
   try {
      conn = setupTheDatabaseConnectionSomehow();
      stmt = conn.prepareStatement("INSERT INTO person (name, email) values (?, ?)");
      stmt.setString(1, name);
      stmt.setString(2, email);
      stmt.executeUpdate();
   }
   finally {
      try {
         if (stmt != null) { stmt.close(); }
      }
      catch (Exception e) {
         // log this error
      }
      try {
         if (conn != null) { conn.close(); }
      }
      catch (Exception e) {
         // log this error
      }
   }
}

名前と電子メールに含まれる文字に関係なく、それらは INSERT ステートメントの整合性を脅かすことなくデータベースに安全に挿入されます。

PreparedStatement クラスは、特定のデータ型に合わせたさまざまな set メソッドを提供し、データベース フィールド定義との互換性を確保します。たとえば、INTEGER 列を設定するには、setInt メソッドが使用されます。使用可能なメソッドの包括的なリストについては、PreparedStatement のドキュメントを参照してください。

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

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