在数字常量周围加上单引号真的可以防止 MySQL 中的 SQL 注入吗?

jas*_*ruz 7 mysql sql-injection

该手册似乎建议在数字周围使用引号足以防止 SQL 注入。

根据第5.3.1通用安全指南中的MySQL 5.1中参考手册

如果应用程序生成查询(例如,SELECT * FROM table WHERE ID=234当用户输入值时)234,则用户可以输入值234 OR 1=1以使应用程序生成查询SELECT * FROM table WHERE ID=234 OR 1=1。结果,服务器检索表中的每一行。这会暴露每一行并导致过多的服务器负载。防止此类攻击的最简单方法是在数字常量周围使用单引号:SELECT * FROM table WHERE ID='234'. 如果用户输入额外的信息,它就会成为字符串的一部分。在数字上下文中,MySQL 自动将此字符串转换为数字并从中去除任何尾随的非数字字符。

如果用户输入值,这是否意味着用户受到保护234' OR 1=1 #?(即生成查询SELECT * FROM table WHERE ID='234' OR 1=1 #'

Noa*_*ter 15

简短的回答,没有。引用技巧很容易通过包含您自己的结束引号和注释符号来消除最终的连接引号,这与您的示例完全相同。

为了保护自己免受 SQL 注入,您必须使用绑定变量。将您的示例更改为SELECT * FROM table WHERE ID = :X然后将用户的输入绑定到 X 可以立即完全解决问题。这种做法的重要性再怎么强调都不为过!