我在一家公司工作,负责数据库模块的人严格反对使用预处理语句。我担心他的实现不安全。
这是我们目前用来进行SQL查询的代码(Java 8应用程序与JDBC/MySQL 5.5):
String value = "Raw user input over HTTP-Form";
String sql = "SELECT * FROM db1.articles WHERE title like '" +
replaceSingleQuotes(value) + "'";
executeSQL(sql);
public static String replaceSingleQuotes(String value) {
value = value.replaceAll("\\\\", "\\\\\\\\");
return value.replaceAll("'", "\\\\'");
}
我无法想出任何注入方法,但他的解决方案对我来说似乎非常可疑。有人能指出如何规避这种转义吗?如果我想不出任何东西,他将不会更换他的代码,而我们的应用程序中有数千个客户的敏感信息(银行业务)。
编辑: 很遗憾,我不能展示executeSQL(),因为类层次结构混乱,一切都零散。但它归结为以下内容:
String query = ... // query escaped with the above function
java.sql.Connection connection = ...
Statement stmt = connection.createStatement();
stmt.executeUpdate(query);
replaceSingleQuotes()
方法。是的,这可能是一个糟糕的想法。即使现在可以逃脱,将来的小重构也可能引入注入漏洞。 - Tim Biegeleisen