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

时间:2018-02-19 08:02:59

标签: java sql security jdbc sql-injection

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

以下是我们目前用于进行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);

1 个答案:

答案 0 :(得分:3)

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

首先,您注入用户名,银行转帐消息,无论是什么

  

转移0.01
  至: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天

在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字符,并考虑数据库引擎的所有独特性。

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

根本问题是他可能不理解准备好的语句,不会获取他们的工作方式。触发不安全可以使某种方式具有攻击性和保护性,甚至是狂热的,只是为了防止承认你只是不知道它们是如何工作的。
试着和他谈谈这个问题,如果他不想听取理由去他的经理并解释问题,如果网站/应用被黑客入侵,那将是你的同事和你的同事经理,并告诉他风险是巨大的。指出最近发生的很多钱被偷走的黑客攻击。

* 可能无法正常工作,取决于实际查询,联接,联合等等。这是一个非常简化的示例