如何降低在 npm 模块中发布敏感信息的可能性

简评:国内也有不少在开源代码里泄露敏感数据的例子,这种事一定要小心啊。

目前 npm 上有着数十万的包,而隐藏在这惊人数量之下的是更令人惊讶的敏感信息泄漏。包括 authentication tokens、密码、生产测试数据(比如信用卡号码)等等。

作为一个开发者,一定要避免泄漏类似的敏感数据。

npm publish

首先,我们要理解npm publish的行为,了解其如何选择要上传的文件对我们控制发布内容至关重要。当然,如果你想要了解最为详细的内容,可以直接查看 npm documentation

当执行npm publish命令时,npm 会打包当前目录下的文件,同时会根据 .gitignore,.npmignore 和 package.json 中的 "files" 属性来决定忽略掉哪些文件和要包括哪些文件。

npm 总是会包含的文件:

  • package.json;
  • README ;
  • CHANGLOG;
  • LICENSE 或者另一种拼写 LICENCE。

npm 总是会忽略掉的文件:

  • .*.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
旧文推荐:
Android 国际货币格式化的一个小知识点
图片加载时使用 SVG 作为图片 placehold

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,050评论 18 139
  • 什么是npm? npm是javascript的包管理工具,是前端模块化下的一个标志性产物简单地地说,就是通过npm...
    雪夜酱阅读 1,164评论 0 0
  • npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具...
    build1024阅读 7,647评论 0 8
  • 想起一个流传已久的故事:某人在街上,仰头向天,久伫。路过的行人看到后,也纷纷望向天空,不久,周围便围了一大群人...
    麦兜的世界阅读 232评论 2 0
  • 已经在新的环境工作了大概快两个月了吧,想起当初一门心思的要从自己奋斗了好几年熟悉的行业,直接跳到一个陌生的行业那种...
    趁光阴还在阅读 241评论 0 0