通过替换占位符而不是在查询中附加用户数据来防止SQL注入

时间:2018-08-05 13:56:48

标签: java sql sql-injection

这听起来确实是一个非常奇怪和模糊的问题。 我正在处理的迷你项目将查询中的where条件生成为完整的字符串,然后将其附加到主查询中,如下所示:

String whereCondition ="someCondition";
String query = "select * from myTable "+ whereCondition;

现在,在经历了什么是SQL注入之后,我知道这种方法是一种非常糟糕的方法,并邀请SQL注入。 我想问的是,如果我采用下面提到的另一种方法,对防止注射会有所帮助吗?

String myTable = "table1";
String query =" select * from {0} {1}";
query = query.replace("{0}",myTable).repalce("{1}",whereCondition);

在此,我没有按照要求替换用户数据和条件,而是替换了查询模板中的占位符。

这可能是另一种不好的方法,但我需要了解它是否会起作用。

欢迎提出意见和建议。

1 个答案:

答案 0 :(得分:1)

关于SQL注入,字符串替换与字符串串联相同: UNSAFE。

如何产生字符串无关紧要。 SQL注入的风险是,您将不安全的内容与SQL字符串组合在一起,然后再将该字符串发送到数据库及其SQL解析器。风险在于,不安全的内容可能会通过更改查询语法来影响查询的逻辑。

大多数时候,建议的避免SQL注入漏洞的方法是对动态内容使用查询参数。但是查询参数只能用于代替SQL表达式中的标量值,而不能用于表名,列名,整个查询子句等。

对于您而言,必须确保内容安全。一种常见的方法是将内容与已知的安全模式进行比较。例如,应该验证您的字符串whereCondition是否与数据库中的已知表之一匹配。

验证像whereCondition这样的整个子句比较复杂。如果您使用应用外部的任何内容(包括但不限于用户输入,从文件中读取的内容,网络服务返回的内容,从数据库中读取的内容)来制作{{1}},那么您的应用很容易受到攻击