已解决
326 浏览
2 回复
PDO 预处理为什么还能被注入?
我用的是 <code>prepare</code> + <code>execute</code>,参数都从 <code>$_GET</code> 取,为什么老师还说有注入风险?是不是只要用了预处理就绝对安全?
2 个回复
按采纳、点赞数排序
王老师 作者
18 天前
预处理确实能防住绝大多数注入,但有几个坑:<br>1. 表名、字段名、ORDER BY 后面的排序字段不能用占位符,只能白名单校验;<br>2. 如果开启了 <code>PDO::ATTR_EMULATE_PREPARES => true</code>,实际是驱动做字符串拼接,仍然有风险,建议关掉;<br>3. LIMIT 后面的数字如果直接拼字符串也危险,要先 <code>(int)</code> 强转。<br>所以结论是:预处理 + 白名单 + 类型转换,三者一起用才安全。
李老师 作者
17 天前
补充一点:宽字节注入(GBK 编码)在老项目里很常见,现在统一用 utf8mb4 基本不用担心,但千万不要自己写 <code>addslashes</code> 来代替预处理。
登录后即可回复话题。去登录 →