不,没有长度太短而无法利用(至少在某些情况下)。
长度过滤器不是针对 SQL 注入的有效保护措施,而准备好的语句确实是唯一适当的防御措施。
然而,长度过滤器是一种很好的深度防御措施(整数过滤器、字母过滤器等也是如此)。在许多情况下,例如有效输入永远不会超过 30 个字符,但有意义的利用需要更多。它应该(但可能不会)不言而喻,任何作为深度防御的过滤都必须在服务器端进行,因为任何客户端都可以简单地被绕过。
限制绕过
限制子句(例如AND
/ OR
)可以被两个字符绕过,这可能会造成真正的伤害,而不仅仅是失败的查询。最简单的示例是登录(其他示例是未经授权删除其他数据):
SELECT * FROM users WHERE userid = [id] AND password = [password]
注射:
id = 1#
password = wrong_password
有效载荷:2个字符
拒绝服务
DoS 攻击只需要很少的字符。在 MySQL 示例中,实际调用需要 7 + x 给定秒 + 能够调用函数和修复查询所需的任何时间。
例子:
SELECT * FROM users WHERE userid = [id]
注入(这是一个有效的注入,更长的形式是1 AND sleep(99)
):
sleep(99)
有效载荷:9 个字符
读取数据
如果显示数据,长度主要取决于表和列名。我将假设所有表的列数相等(它可能会发生,它可以节省字符)。
例子:
SELECT * FROM comments WHERE commentid = [id]
注射:
1 union select * from users
有效载荷:27 个字符。
编辑数据
未经授权的数据库修改也可以用很少的字符来实现。
例子:
UPDATE users SET password = '[password]' WHERE id = [id]
注入(进入密码):
',isadmin='1
有效载荷:12 个字符
绕过限制也可以(结果是所有密码现在都是空的*):
'#
有效载荷:2个字符
* 为了简单起见,使用密码示例;应该对密码进行哈希处理,从而使示例无法进行。该示例仍然适用于所有类似情况(更新用户名、更新权限等)