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



这听起来确实是一个非常奇怪和模糊的问题。我正在进行的迷你项目将查询中的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);

在这里,我不是附加用户数据和条件,而是根据需要替换查询模板中的占位符。

这可能是另一种糟糕的方法,但我需要了解它是否有效。

欢迎提出意见和建议。

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

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

大多数情况下,避免SQL注入漏洞的推荐方法是对动态内容使用查询参数。但是查询参数只能用于SQL表达式中的标量值,而不能用于表名、列名、整个查询子句等。

在您的情况下,您必须确保内容是安全的。一种常见的方法是将内容与已知的安全模式进行比较。例如,应该验证字符串myTable是否与数据库中的某个已知表匹配。

验证像whereCondition这样的整个子句更为复杂。如果您使用应用程序外部的任何内容(包括但不限于用户输入、从文件读取的内容、web服务返回的内容、从数据库读取的内容(生成whereCondition,则您的应用程序易受攻击。

最新更新