我在这里看到一些人说,使用 mysql_real_escape_string
连接查询语句不能完全保护你免受 SQL 注入攻击。
然而,我还没有见过一个示例能说明有哪种输入会绕过 mysql_real_escape_string
的保护。大多数示例都忘记了 mysql_query
仅限于一个查询,并且错误地使用了 mysql_real_escape_string
。
我唯一能想到的示例是以下内容:
mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input));
这将无法保护您免受以下输入的影响:
5 OR 1=1
我认为这是对mysql_real_escape_string
使用不当,而不是其缺陷,因为它是为字符串设计的,而不是数字值。你应该将其转换为数字类型,或者如果你打算将输入作为字符串进行清理,则在查询中也应该这样做,并在其周围包裹引号。
有人能提供一个绕过mysql_real_escape_string
的示例吗?这个示例不能依赖于错误处理数字值或忽略mysql_query
只能执行一条查询的情况。
编辑:我对mysql_real_escape_string
的限制感兴趣,而不是将其与替代方案进行比较。我意识到新项目有更好的选择,但并不争议这一点。
mysql_*
的解决方案呢? - Mihai Iorga%_
),它们在LIKE
中是通配符。这算不算缺陷? - NullUserException