坏代码:为什么这很危险?

Epa*_*aga 19 java sql security sql-injection

可能重复:
我可以通过使用单引号转义单引号和周围用户输入来防止SQL注入吗?

     String badInput = rawInput.replace("'","''");
     ResultSet rs = statement.executeQuery("SELECT * FROM records WHERE col1 = '"+badInput+"'";
Run Code Online (Sandbox Code Playgroud)

有没有办法对这段代码进行" Bobby Tables "式攻击?

Dav*_*und 10

根据所有必须解释命令的不同步骤,可能有一些可能传递%27(例如)并使其作为单引号,通过替换而不被注意.

但即使可以涵盖所有这些案例,而且这个单一问题实际上是安全的,但它缺乏一致性,因为它不能一致地实施.其他人可能会加入并希望添加AND int1 = var1,并注意到您已经考虑过SQL注入,因此他们只是以您拥有的确切方式修改代码

String badInput = rawInput.replace("'","''");
String badInteger = rawInteger.replace("'","''");
ResultSet rs = statement.executeQuery("SELECT * FROM records WHERE" +
 "int1 = " + badInteger + " OR col1 = '"+badInput+"'");
Run Code Online (Sandbox Code Playgroud)

...只有整数,它不再是你要保护自己的引用!在这里,很明显看到任何事情都可能出错.因此,虽然这是一个需要有人很难实现它的问题,但我认为这是设计中最大的问题 - 它只涵盖了一小部分案例.

最好能够只是说"以下是一个变量.无论它包含什么,将它视为一个值,并且不要试图将它的一部分用作代码并执行该代码."