这个简单的字符串转义是否可以阻止任何SQL注入?

我在一家公司工作,负责数据库模块的人严格禁止使用预准备语句。 我担心他的实施不安全。

以下是我们当前用于进行SQL查询的代码(带有JDBC / MySQL 5.5的Java 8应用程序):

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); 

一种攻击方法是“加载”攻击。

首先,您注入用户名,银行转帐消息,无论如何

转移0.01
至:02020.020202.200202
名称:johnny tables’; drop table foobar –

将被转移到

 johnny tables\';drop table foobar -- 

到现在为止还挺好。 保护有效。 我们的附件失败了 我们尝试加载攻击。

现在我们要制定预定的付款单。

这假设发生了一个常见的错误,一旦插入数据库,该值就是“安全的”,因为它已被检查过一次。

转移0.01
至:02020.020202.200202
名称:johnny tables’; drop table foobar–
时间表:从现在起1天

在db中存储订单

 'johnny tables\';drop table foobar--' 

将被存储为

johnny tables’; drop table foobar–

现在在午夜,调度程序启动并开始迭代计划的付款

 select name from scheduled where time > x and < y 

所以银行代码开始嘎然而止

 String name = result['name']; String acct = result['acct']; String amt = result['amt']; string query = "insert into payment_process (name,acct,amt) values('"+name+"','"+acct+"','"+amt+"'); 

和繁荣,你的桌子掉了下来。 *

当你走手动路线时,你必须确保变量的所有,每个和每个实例都被转义,所有unicode字符都被考虑在内,所有的数据库引擎都被考虑在内。

此外,使用预准备语句可以显着提高速度,因为您不必重建查询。 您可以只构建它们一次,将它们存储在缓存中,然后交换参数。
特别是在迭代大型列表时,它们是一个神。

根本问题是他可能不理解准备好的陈述,也不了解它们的工作方式。 不安全触发可以使某种方式具有侵略性和保护性,甚至狂热,只是为了防止承认你只是不知道它们是如何工作的。
试着和他谈谈这件事,如果他不想听取理由去他的经理并解释问题,如果网站/应用程序遭到黑客入侵,它将由你的同事和你的同事负责经理,并告诉他风险是巨大的。 指向最近的黑客行为,其中很多钱像快速黑客一样被盗。

* 可能实际上不起作用,取决于实际查询,连接,联合等。这是一个非常简单的例子