最可靠的方式是使用预处理(prepared statements)。pdo预处理+参数绑定将sql结构与数据完全分离,从根本上防止sql注入;mysqli预处理同样有效但写法更繁琐;而mysql_real_escape_string等转义方式已过时且存在多种漏洞。
PHP 查询语句防注入,最可靠的方式就是**不用拼接 SQL 字符串,改用预处理(Prepared Statements)**。其他所谓“过滤”“转义”“正则替换”都是补丁式做法,容易漏、难维护、不通用。
为什么 mysql_real_escape_string 不够用
这个函数只对单引号、反斜杠等做转义,但仅适用于 mysql_query 且必须配合单引号包裹变量——一旦漏写引号,或用于数字型字段未加引号,立刻失效。更严重的是:mysql_* 函数在 PHP 7.0+ 已被彻底移除,继续用等于主动放弃安全更新和语言支持。
- 它无法防御基于布尔/时间的盲注
- 对多字节编码(如 GBK)存在宽字节注入漏洞
- 不能保证类型安全:字符串转义后仍可能被当作数字参与运算
PDO 预处理 + 参数绑定是当前标准解法
PDO 的 prepare() 和 execute() 将 SQL 结构与数据完全分离,数据库驱动层负责把参数按类型安全地传入,根本不会解析成 SQL 代码。哪怕用户输入 ' OR 1=1 -- ,也只会当做一个普通字符串值处理。