简评:国内也有很多在开源代码里泄露敏感数据的例子,这种事必定要当心啊。
目前 npm 上有着数十万的包,而隐藏在这惊人数量之下的是更使人惊讶的敏感信息泄漏。包括 authentication tokens、密码、生产测试数据(好比信用卡号码)等等。git
做为一个开发者,必定要避免泄漏相似的敏感数据。npm
npm publishjson
首先,咱们要理解 npm publish 的行为,了解其如何选择要上传的文件对咱们控制发布内容相当重要。固然,若是你想要了解最为详细的内容,能够直接查看 npm documentation。安全
当执行 npm publish 命令时,npm 会打包当前目录下的文件,同时会根据 .gitignore,.npmignore 和 package.json 中的 "files" 属性来决定忽略掉哪些文件和要包括哪些文件。app
npm 老是会包含的文件:curl
npm 老是会忽略掉的文件:svn
.*.swp
._*
.DS_Store
.git
, hg
, .svn
, CVS
版本控制目录.npmrc
.lock-wscript
.wafpickle-*
config.gypi
npm-debug.log
.gitignore vs .npmignore
忽略某些文件最经常使用的作法之一就是在 .gitignore 文件中声明。由于,这些你不想提交到仓库的文件一般你也不会想把它们发布出去。工具
npm 本身也有一个 .npmignore 文件,其行为与 .gitignore 彻底同样。而这二者并非叠加的关系,而是替代关系。若是你在项目中增长了 .npmignore,那么其会彻底替代掉 .gitignore 的做用。所以,若是你尝试两个都使用的话,可能就会无心中发布某些你认为已经排除掉的文件。测试
所以,若是能够的话最好坚持使用 .gitignore,但若是是用其余的版本控制工具,那就使用 .npmignore 吧。网站
文件白名单
除了去控制哪些文件被排除,还能够经过 package.json 中的 "files" 属性来控制包含哪些文件 - whitelisting with the files array。目前只有 57,000 个包使用了这种方式来控制发布的内容,虽然可能比较麻烦,但确实是最安全的作法。
若是这样作,最终打包的文件将是 "files" 中声明的文件加上上面提到的确定会包含的文件再减去被排除掉的文件。
使用只读 tokens
若是你有私有包使用了持续集成(CI)服务,一般会须要提供一个 token 认证,来让 CI 可以完成所需的工做。如今,你能够生成一个只读的 token 给 CI,若是其被泄漏了,形成的损害也会颇有限。
目前 npm 命令行还不支持这个功能,但咱们能够手动生成:
curl -u [USERNAME]:[PASSWORD] https://registry.npmjs.org/-/npm/v1/tokens \ -X POST -H 'content-type: application/json' \ -d '{"password":"[USERNAME]", "readonly": "true"}'
能够点击 npm 网站中的我的头像 -> Tokens 中检查和删除建立的 token。
若是真的不幸泄露了敏感信息,怎么办?
首先你要明白模块一旦发布,基本立刻就会被复制到其余的镜像。要确保泄漏的信息不会形成损害最好的办法就是立刻让被泄漏的 API 秘钥失效,或者立刻修改被泄露的密码。
而若是泄露的信息不是你能修改的,那你的第一步应该是 unpublish the package 来减少损害,而后才去任何适用于数据泄漏的其余操做。但若是你想要 unpublish 的模块已经发布超过了 24 小时,那就只能寻求 npm 支持团队(support@npmjs.com)的帮助了。
总结
若是开发中真的有很敏感的信息,仍是建议用白名单来控制,不要嫌麻烦。由于 npm 的特性,一旦泄露基本很快就会被发现。
原文: Publishing what you mean to publish