这个简单的字符串转义能够防止所有的SQL注入吗?

3

我在一家公司工作,负责数据库模块的人严格反对使用预处理语句。我担心他的实现不安全。

这是我们目前用来进行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
4
那个人故意在你们的系统中制造漏洞,他应该被解雇吗? - lolbas
5
反对使用预处理语句?这还是头一回听到。同时祝贺你们有一个负责数据库模块的优秀人员。 - Kayaman
1
这里的问题不在于这段代码是否安全。问题在于,如果这个人宁愿使用自己的“解决方案”而不是行业标准,那么他可能还有其他怪癖。这是一个严重的安全问题,你也不会让这个人建造自己的银行保险库。 - Kayaman
1
可能是[SQL注入:replace("'", "''")不够好吗?]的重复问题。(https://dev59.com/fmoy5IYBdhLWcg3wguSS) - AxelH
显示剩余13条评论
1个回答

3

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

首先,您将用户名称、银行转账信息或任何其他内容注入其中

transfer 0.01
to: 02020.020202.200202
name: johnny tables';drop table foobar --

将被转义为

johnny tables\';drop table foobar  --

目前为止一切顺利,保护措施已生效。我们的攻击失败了,现在我们要尝试加载攻击。

现在我们将创建一个预定的付款订单。

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

转账 0.01元
到:02020.020202.200202
名称:johnny tables';drop table foobar--
计划时间:从现在开始1天后

将订单存储在数据库中。

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

将被存储为

约翰尼表格的;删除表格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字符都被考虑到,并且考虑到数据库引擎的所有特殊性。

此外,使用预处理语句可以显著提高速度,因为你不需要重建查询。你只需要构建一次,将它们存储在缓存中,然后仅交换参数。
特别是在迭代大型列表时,它们是非常有用的。

根本问题在于他可能不理解预处理语句,不知道它们如何工作。触发不安全因素会使人变得攻击性和保护性,甚至狂热,只是为了防止承认自己不知道它们如何工作。
试着与他谈论这个问题,如果他不愿意听理性的解释,就去找他的经理解释这个问题,告诉他如果网站/应用程序被黑客攻击,责任将落在你的同事和经理头上,并告诉他风险是巨大的。指出最近发生的一些盗窃大量资金的黑客事件。

* 实际查询、连接、联合等可能不起作用,这只是一个非常简化的例子


1
从我所看到的,我猜测所提出的“API”将会在每次读取数据时使其不安全(以正常方式使用),因此它不会被直接使用。但如果我的猜测是错误的,那么这将是一个非常好的安全问题!虽然我从未亲眼见过它的实施,但我喜欢这种攻击! - AxelH
我曾经认为这是一种标准的黑客入侵数据库的方式,他们使用这种安全措施 :-) 但那是因为我看到其他比我薪水高的程序员使用的代码,并发现了安全漏洞,因为我不想让老板对我大喊大叫 :-) 相信我所说的,互联网上的漏洞比筛子还多,像OP的同事这样的程序员比跟上时代的人更常见。我知道一个航班引擎,我可以用一个查询语句清空整个数据库...我告诉我的老板,让他们使用预处理语句,否则我拒绝使用它。 - Tschallacka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接