这个简单的字符串转义可以防止任何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);
解决方法:
一种攻击方法是“加载”攻击.
首先,您将银行转帐消息作为用户名注入其中
transfer 0.01
to: 02020.020202.200202
name: johnny tables’;drop table foobar —
会逃到
johnny tables\';drop table foobar --
到现在为止还挺好.有效的保护.我们的附加失败.我们尝试加载攻击.
现在,我们要进行预定的付款订单.
假设发生一个常见错误,该错误一旦插入数据库,便是“安全的”,因为已经对其进行了一次检查.
transfer 0.01
to: 02020.020202.200202
name: johnny tables’;drop table foobar–
schedule: 1 day from now
将订单存储在数据库中
'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字符,要考虑数据库引擎的所有惯用法.
同样,使用准备好的语句可以大大提高速度,因为您不必重建查询.您只需构建它们一次,将它们存储在缓存中,然后换出参数即可.
尤其是在迭代大型列表时,它们是天赐之物.
根本问题是他可能不了解准备好的陈述,无法理解它们的工作方式.引发不安全感可能会以某种方式进行侵略和保护,甚至是狂热,只是为了防止承认您只是不知道它们是如何工作的.
尝试与他谈谈,如果他不想听原因,去找他的经理并解释问题,如果网站/应用程序被黑客入侵,它将在您的同事和您的头上经理,告诉他风险很大.指出最近的黑客攻击,其中有很多钱像快速黑客一样被盗.
*可能无法实际运行,具体取决于实际查询,联接,联合等.这是一个非常简化的示例
标签:security,jdbc,sql-injection,sql,java 来源: https://codeday.me/bug/20191109/2012829.html