在 MySQL 中,可以在关键字本身中插入注释,这提供了另一种绕过某些输入验证过滤器的方法,同时保留实际查询的语法。例如:
SEL/*foo*/ECT username,password FR/*foo*/OM users
但是怎么可能注释掉保留词之间的东西呢?有什么好处?为什么它是一种绕过?
好像有毛病!
在 MySQL 中,可以在关键字本身中插入注释,这提供了另一种绕过某些输入验证过滤器的方法,同时保留实际查询的语法。例如:
SEL/*foo*/ECT username,password FR/*foo*/OM users
但是怎么可能注释掉保留词之间的东西呢?有什么好处?为什么它是一种绕过?
好像有毛病!
该引用来自 2007 年的一本书......对于早期版本的 MySql 可能是正确的,但我找不到该语法不返回错误的 MySQL 版本。
这种语法背后的最初想法是,如果应用程序试图将某些 SQL 关键字列入黑名单,那么这种攻击就会欺骗应用程序。
例如......如果应用程序试图阻止攻击者使用 Sql 注入从数据库中删除记录,则不允许的术语黑名单将过滤掉DELETE
......但无法过滤掉DEL/**/ETE
。
但是,尝试在动态查询中创建禁止使用的术语黑名单是防止 SQL 注入的一种糟糕且无效的方法......并且有更简单有效的方法来防止 SQL 注入攻击,例如参数化查询,这会导致嵌入的注释语法即使仍然有效也无用。
几乎总是这样,黑名单充满了漏洞,使其无法有效防止 SQL 注入攻击。例如,攻击者可以:
- 未引用的目标字段
- 想办法绕过对某些转义元字符的需求
- 使用存储过程隐藏注入的元字符
感谢迈克尔弗雷德里克森完美的答案。
查看 mysql 站点,您会看到所有版本的 mysql 中都提到了这种评论方式。
在我的版本(5.5.24)中,如果您编写如下查询:
sele/*ops*/ct name from tableName
你会得到这个错误:
You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'sele/*ops*/ct name from
tableName' at line 1
但是如果你把它改成这样:
select na/*ops*/me from tableName
你会得到这个:
Unknown column 'na' in 'field list'
我认为它评论了字段名称的其余部分。但是如果你像这样编写查询,它可以正常工作:
select name/*ops*/ from tableName