一个凭据扫描器,在一个零硬编码凭据的代码库里,报了842条安全漏洞。这不是谨慎,是坏了。我的扫描规则就是这样废掉的。直到另一个同行插件在同一个代码库上,报出的数量还不到我的一半,我才开始查。
这两条规则——secure-coding/no-hardcoded-credentials 和 eslint-plugin-no-secrets/no-secrets——同时跑在 vercel/ai(那个AI SDK)上,作为ILB旗舰基准测试的一部分。它们看到的是同一份源码。结果计数差距2.2倍,大到让人想发篇博客。但每条凭据检测规则都有精确度问题,差距的方向才是关键。我们抽检了那807条“仅我方发现”的记录。
![]()
命中率最高的几项长这样:一个TypeScript联合类型的字面量,一个错误类的名字,一个测试用例里的prompt参数。没一个是凭据。我们的规则在类型名、错误类名,以及"test"这个字符串上触发了告警。807条,全是假阳性。
这条正则是我写的。它通过了代码审查——我自己的,还有单元测试的。它上线的原因很坦诚:我给它喂的每个测试用例,看起来都像一个秘密。比如一条打了码的Stripe密钥,一个AWS示例访问密钥,一个真实的JWT。正则把它们全抓出来了,测试套件全绿,于是我发布了。代码上方那行注释甚至写着“任何32字符以上的、带下划线或连字符的字母数字组合”——我读到的意思是“32字符以上的随机串”,因为我眼前每个例子都是随机的。我从来没给一个长度够长的英文词写测试。`experimental_onToolExecutionStart` 是标识符形态的,不是凭据形态的。只靠正向用例搭起来的测试套件,永远暴露不了这种缺口。这规则不是在我测试过的代码里有bug,而是在我没写的测试里。
这是旗舰基准测试里第二个教会我一件事的发现:没有精确度打底,发现数量毫无意义。第一次是我们在Next.js上用no-cycle规则跑出0个发现,而真实数字是245——那篇关于缓存投毒的文章里写过。这次的教训是反过来的:我报出了海量结果,几乎全错。
eslint-plugin-no-secrets 只靠一个信号:香农熵。规则遍历每个字符串字面量,计算熵值。如果熵值≥4.0(默认容忍度),就报警。它配了一个可选的标识符排除黑名单,还有一个路径形态的字符串过滤器(像 ./foo , node:fs , @scope/pkg 会被跳过)。整个模型就是:高熵值大概率意味着随机,随机大概率意味着凭据。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.