我在一家公司工作,该公司负责数据库模块的人员严格禁止使用准备好的语句。我担心他的实施不安全。
这是我们当前用于进行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 table’; drop table foobar-
会逃到
johnny tables\';drop table foobar --
到目前为止,一切都很好。有效的保护。我们的附加失败。我们尝试加载攻击。
现在,我们要安排一个预定的付款订单。
假设发生一个常见错误,该错误一旦插入数据库,便是“安全的”,因为已经对其进行了一次检查。
转移0.01
到:02020.020202.200202
名称:johnny table’; drop table foobar–
时间表:从现在开始1天
将订单存储在数据库中
'johnny tables\';drop table foobar--'
将存储为
johnny table’; 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字符都被考虑了,数据库引擎的所有惯性都被考虑了。
同样,使用准备好的语句可以大大提高速度,因为您不必重建查询。您只需构建它们一次,将它们存储在缓存中,然后换出参数即可。
尤其是当迭代大列表时,它们是天赐之物。
问题的根源在于,他可能不明白预处理语句,并没有 得到
他们,他们是如何工作的。引发不安全感可能会以某种方式进行侵略和保护,甚至是狂热,只是为了防止承认您只是不知道它们是如何工作的。
尝试与他谈谈,如果他不想听原因,去找他的经理并解释问题,如果网站/应用程序被黑客入侵,它将在您的同事和您的头上经理,告诉他风险是巨大的。指出最近的黑客攻击,其中有很多钱像快速黑客一样被盗。
*
可能无法实际运行,具体取决于实际查询,联接,联合等。这是一个非常简单的示例
问题内容: 我试图在Java中放置一些反SQL注入,并发现使用“ replaceAll”字符串函数非常困难。最后,我需要,将转换现有的功能使得当字符串由MySQL的SQL注入评估将被阻止。 我已经整理了一些正在使用的代码,并且该函数中的所有内容都使我大失所望。如果有人碰巧有这个例子,我将不胜感激。 问题答案: PreparedStatement是可行的方法,因为它们使SQL注入成为不可能。这是一个
问题内容: 我试图在Java中放置一些反SQL注入,并发现使用“ replaceAll”字符串函数非常困难。最后,我需要,将转换现有的功能来,任何到,任何到,任何以使得当字符串由MySQL的SQL注入评估将被阻止。 我已经整理了一些正在使用的代码,并且该函数中的所有内容都使我大失所望。如果有人碰巧有这个例子,我将不胜感激。 问题答案: PreparedStatement是可行的方法,因为它们使SQ
问题内容: 我正在使用MySQL API的功能 根据文档,它转义以下字符: 现在,我查看了OWASP.org的ESAPI安全库,并在Python端口中包含以下代码(http://code.google.com/p/owasp- esapi-python/source/browse/esapi/codecs/mysql。 py ): 现在,我想知道是否真的需要转义所有这些字符。我知道为什么%和_在那
我一直在准备技术面试。所以有一件事我不确定。如果我写一个例子 这是否已经防止了字符串注入?或者我必须这样写: 提前道谢!
下午好 我认为与结合使用可以防止SQL注入到这些参数之上。 例如:
我试图防止POST请求中的字符串(在本例中为变量)被转义,因为它将存储在JSON中。我的代码是 调试我可以看到是unicode类型,我相信这是Django处理请求对象的方式。实际的字符串,尽管unicode没有得到它的特殊字符,直到。如果我尝试将其更改为以防止它被转义,我得到错误: 有什么想法吗?