1. ホーム
  2. java

[解決済み] Java - SQLインジェクションを防止するためのエスケープ文字列

2022-04-27 01:36:40

質問

私はjavaでいくつかのアンチsqlインジェクションを配置しようとしていますが、"replaceAll"文字列関数を扱うのが非常に困難であることが分かっています。最終的には、既存の文字列を変換する関数が必要です。 \\\ は、任意の " から \" は、任意の ' から \' と、任意の \n から \\n この文字列がMySQLで評価されるとき、SQLインジェクションがブロックされるようにするためです。

私が作業していたあるコードをジャックしたところ、すべての \\\\\\\\\\\ の関数で、目がおかしくなりそうです。もし、どなたかこのような例をお持ちでしたら、ぜひ教えてください。

どのように解決するのですか?

PreparedStatementsは、SQLインジェクションを不可能にするので、この方法がお勧めです。 ここでは、ユーザーの入力をパラメータとした簡単な例を示します。

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
      }
   }
}

nameとemailにどんな文字があっても、それらの文字は直接データベースに配置されます。 これらは、INSERT文に何ら影響を与えません。

データ型によって異なるセット方法があり、どれを使うかは、データベースのフィールドが何であるかによります。 たとえば、データベースに INTEGER カラムがある場合、そのカラムに対して setInt メソッドを使用します。 PreparedStatementのドキュメント には、データの設定や取得に使用できるすべてのメソッドがリストアップされています。