プライベート メソッドを使用して、単一のクラスによって実行されるすべてのクエリのクエリ実行を処理すると、SQL インジェクション攻撃のリスクが高まるという指摘がありました。
このメソッドの例は、次のようになります (以下)。実装時に誰かの気を散らさないように、いくつかの詳細を省略しました。
実装について話したい場合は、コメントでお気軽にどうぞ。セキュリティレビューはメソッドの内容についてはコメントしていませんが、主に独自のメソッドであってはならないという事実です。
queryText は、準備済みステートメントの SQL テキストを含む保護された静的最終文字列から生成されることに注意してください。準備されたステートメント テキストの ? は、PreparedStatement の setString (または任意の設定) メソッドを使用して設定されます。準備されたステートメントに設定された変数は、可能な限り厳密に型指定された呼び出し元メソッドに入ります。
次に、queryText がプライベート メソッドに渡されます。
private ResultSet executeQuery(PreparedStatement stmt) throws SQLException {
// Declare result set variable
try{
try{
// execute statement and store in variable
}
catch(SQLException se){
// log, close connection, do any special processing, rethrow se
}
}
finally{
// This finally block is here to ensure the connection closes if
// some special processing (not shown) in the other try generates a runtime exception
// close connection and statement properly
}
// return result set
}
推奨される代替手段は、クエリを実行する各メソッドで基本的に同じコードをインライン化することでした。
私はこれを security.stackexchange.com に投稿しませんでした。これは、特定のセキュリティ プログラミングの問題であると思われるためです。
このコードを (プライベート メソッドから) 多くのクラスに複製することで保護が追加される理由が思いつきません。そうでしょうか?
ありがとうございました