我曾经有人指出,使用私有方法来处理由单个类完成的所有查询的查询执行会增加 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,因为我认为它符合特定的安全编程问题。
我想不出为什么将这段代码(从私有方法)复制到许多类中会增加任何保护。会吗?
谢谢