私は Java でアンチ SQL インジェクションを導入しようとしていますが、「replaceAll」文字列関数の操作が非常に難しいと感じています。最終的には、既存の any を\
に\\
、any"
を に\"
、any'
を に\'
、any を に、any\n
を に変換する関数が必要です。\\n
これにより、文字列が MySQL によって評価されるときに SQL インジェクションがブロックされます。
作業中のコードの一部がおかしくなってしまい、\\\\\\\\\\\
関数内のすべてが目がおかしくなりそうです。もし誰かがこの例を持っているなら、とてもありがたいです。
ベストアンサー1
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
}
}
}
名前とメール アドレスにどのような文字が含まれていても、それらの文字はデータベースに直接配置されます。INSERT ステートメントにはまったく影響しません。
さまざまなデータ型にはさまざまな設定メソッドがあり、どのメソッドを使用するかはデータベース フィールドによって異なります。たとえば、データベースに INTEGER 列がある場合は、メソッドを使用する必要がありますsetInt
。PreparedStatement ドキュメントデータの設定と取得に使用できるさまざまなメソッドをすべて一覧表示します。