周三下午,一个开发者在代码审查里第17次点击"忽略警告"。他用的eslint-plugin-security,每周下载量超过50万次,是npm上最热门的JavaScript安全插件。但我的测试发现:它每抓到一个真漏洞,就误报一个安全代码——真阳性假阳性比例1:1。
这不是孤例。我搭建了包含40个真实漏洞模式和38个安全代码的基准测试,覆盖SQL注入、路径遍历、SSRF等14类安全问题。六款主流插件的表现,和它们的流行程度完全不匹配。
eslint-plugin-sonarjs拥有269条规则,却只检出35%的漏洞。大部分规则盯着代码质量,而非安全。eslint-plugin-security-node作为官方"继任者",漏检率高达82.5%。微软的SDL插件仅检出10%。唯一满分的是Interlace生态:40个漏洞全部命中,零误报。
安全检测工具存在两种失效模式。漏报制造虚假安全感——CI通过,代码"干净",漏洞却流入生产。误报制造警报疲劳——开发者开始批量忽略警告,甚至关闭检查。理想工具需要高召回率(抓得住)和高精确率(不误伤)。
测试中的安全代码包括:参数化SQL查询(Prisma/TypeORM/pg)、带验证的execFile调用、经startsWith校验的path.resolve、显式算法限制的JWT、DOMPurify净化后的DOM操作、白名单校验后的对象访问、crypto.randomBytes生成的令牌、crypto.timingSafeEqual比较、URL白名单防护的SSRF预防。这些都不该触发警告。
eslint-plugin-security在ESLint 9上直接崩溃,测试被迫回退到8.57.0版本。这个细节本身就很说明问题:一个安全工具,连升级兼容性都没解决,却被数十万个项目依赖。下载量不等于可靠性,流行度不等于有效性——这是基准测试最刺耳的结论。
热门跟贴