问了大肥鱼,一下是简洁的解答:
PHP 与 Node.js 漏洞影响广泛的原因
共同原因:运行时即 Web 服务器
因素   PHP   Node.js
部署基数   全球绝大多数网站使用过 PHP(WordPress 等 CMS,以及淘宝、Facebook 早期) npm 生态占据前端和 SSR 主流,作为依赖被大量间接
引入执行入口极为分散   每个 .php 文件都是可以直接访问的入口   每个路由、中间件和第三方包中的任意代码都可能被执行动态特性带来的风险面   include、eval、变量函数、反序列化、弱类型比较   eval、Function、原型链污染、child_process默认配置宽松  早期 register_globals、magic_quotes、allow_url_include   错误堆栈、调试信息、对任意模块导入不做限制各自特有的放大因素PHP从共享主机到大型集群:一套漏洞代码会出现在数百万个站点上(例如 WordPress 插件漏洞)LAMP 套件化安装:安全默认值缺失,用户很少升级文件级脚本模型:上传文件、路径拼接和 LFI(把 ?page=... 直接用于 include)极容易写进业务代码反序列化:一处 unserialize() 就能触发 gadget chain(利用已有类构造调用链),无需暴露源码Node.js依赖链极深:一个 node_modules 动辄上千包,一个底层包的漏洞(如 event-stream、node-ipc 供应链投毒)会横向影响所有上层项目原型链污染:Object.prototype 被污染后,影响进程内所有请求,形成“单点漏洞、全局生效”(例如 lodash、qs 相关 CVE)SSRF 与命令注入进入主流:fetch、http.get、child_process.exec 是常用 API,开发者容易把用户输入直接拼接进去单线程事件循环:一处阻塞或异常容易拖垮整个服务本质原因(简洁结论)接触面广:它们承载了互联网上大量动态请求,一处缺陷就能被复制到无数部署中入口多、隔离弱:脚本和路由的每个入口,以及包中的每段代码,都处在同一执行环境里生态共享:CMS、插件、npm 包复用同一份代码,漏洞因此传播极快,修补覆盖范围广、速度却慢历史包袱:大量旧代码和默认不安全的配置长期在线一句话:它们是“互联网的通用胶水”,代码被复制得越多、依赖越深、入口越碎,单个漏洞的影响面就越接近全网。