坏代码:为什么这很危险?
2022-09-02 13:26:38
String badInput = rawInput.replace("'","''");
ResultSet rs = statement.executeQuery("SELECT * FROM records WHERE col1 = '"+badInput+"'";
有没有办法对此代码进行类似“Bobby Tables”的攻击?
String badInput = rawInput.replace("'","''");
ResultSet rs = statement.executeQuery("SELECT * FROM records WHERE col1 = '"+badInput+"'";
有没有办法对此代码进行类似“Bobby Tables”的攻击?
根据整个过程中的不同步骤,所有步骤都必须解释命令,可能会有一些可能性传递(例如)并将其用作单个引号,通过替换而不被注意到。%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+"'");
...只有整数,它不再是你想要保护自己的引号!在这里,很明显,任何事情都可能出错。因此,虽然这是一个需要有人糟糕实现它的问题,但我认为这是设计的最大问题 - 它只涵盖了一小部分情况。
能够说“以下是一个变量”总是会更好。无论它包含什么,都要将其视为一个值,不要尝试将其部分用作代码并执行该代码。
在MySQL中,如果没有设置NO_BACKSLASH_ESCAPES选项,我相信这是可能的。
\'); DROP
或类似的东西。您的代码将使 .第一个将通过反斜杠转义,第二个将关闭允许 SQL 注入的字符串。'
'
为了安全起见,我通常更喜欢坚持准备好的陈述。