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

2022-09-02 13:26:38

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

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

有没有办法对此代码进行类似“Bobby Tables”的攻击?


答案 1

根据整个过程中的不同步骤,所有步骤都必须解释命令,可能会有一些可能性传递(例如)并将其用作单个引号,通过替换而不被注意到。%27

但是,即使可以涵盖所有这些情况,并且对于这个单一问题来说实际上是安全的,它缺乏的是它不能统一实施。其他人可能会过来想要添加 ,并注意到您已经考虑过SQL注入,因此他们只是以您拥有的确切方式修改代码AND int1 = var1

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

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

能够说“以下是一个变量”总是会更好。无论它包含什么,都要将其视为一个值,不要尝试将其部分用作代码并执行该代码。


答案 2

在MySQL中,如果没有设置NO_BACKSLASH_ESCAPES选项,我相信这是可能的。

\'); DROP 

或类似的东西。您的代码将使 .第一个将通过反斜杠转义,第二个将关闭允许 SQL 注入的字符串。''

为了安全起见,我通常更喜欢坚持准备好的陈述。