Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 流星是如何安全的?_Meteor - Fatal编程技术网

Meteor 流星是如何安全的?

Meteor 流星是如何安全的?,meteor,Meteor,文档建议使用Meteor.methods来创建安全的方法 用户是否可以在浏览器控制台中编写代码,允许用户绕过安全性并向服务器数据库(MongoDB)发送任意数据?如果不是,为什么不呢?是的,但仅当方法无法检查其输入和上下文时。幸运的是,meteor提供了使这项任务变得非常简单的工具。让我们看一个我用来回答的示例方法sendMessage是一种允许用户在聊天室中发送消息的方法: Meteor.methods({ sendMessage:函数(消息,房间ID){ 检查(消息、字符串); 检查(房间号

文档建议使用Meteor.methods来创建安全的方法


用户是否可以在浏览器控制台中编写代码,允许用户绕过安全性并向服务器数据库(MongoDB)发送任意数据?如果不是,为什么不呢?

是的,但仅当方法无法检查其输入和上下文时。幸运的是,meteor提供了使这项任务变得非常简单的工具。让我们看一个我用来回答的示例方法
sendMessage
是一种允许用户在聊天室中发送消息的方法:

Meteor.methods({
sendMessage:函数(消息,房间ID){
检查(消息、字符串);
检查(房间号、字符串);
如果(!this.user)
抛出新流星。错误(401,‘您必须登录’);
如果(uu.isEmpty(消息))
抛出新流星。错误(403,“消息不能为空”。);
var room=Rooms.findOne(roomId);
如果(!房间)
抛出新的流星。错误(404,“找不到房间”);
如果(!\包含(room.members、this.userId))
抛出新的流星。错误(403,‘你不在房间里’);
返回消息。插入({
userId:this.userId,
室友:室友,
信息:信息
});
}
});
以下是验证:

  • 使用(防止注入攻击)确保输入类型正确
  • 确保用户已登录(请参阅)
  • 确保消息格式正确
  • 确保房间存在
  • 确保当前用户实际在房间中
将此与
sendMessage
的简单实现进行对比:

Meteor.methods({
sendMessage:函数(消息,房间ID){
返回消息。插入({
userId:this.userId,
室友:室友,
信息:信息
});
}
});
在这里,任何连接的客户端都可以打开终端,开始向任何聊天室注入消息。更糟糕的是,
message
可能是一个对象,并对其他客户端造成各种意外后果

没有免费的安全午餐-你应该验证一切并假设最坏的情况。但是,如果您做出努力,实际上可以生成高度安全的方法


我强烈建议大家看看艾米丽·斯塔克的演讲,她在演讲中更详细地阐述了这些要点。

很酷,谢谢。我知道方法本身是如何安全的,但是用户是否可以通过覆盖Meteor对象(或类似对象),然后创建没有这些检查的任意方法来绕过这些检查?也许用户可以从页面内部手动请求页面(inception)并修改脚本,然后使用修改后的代码在iframe中运行它?或者在当前环境中使用仔细重写的方法运行它?这是可能的,还是服务器端有什么东西可以确保这是不可能的?Meteor的编写假设客户机代码可能会被完全破坏。不管客户机上发生了什么,所有数据库突变都必须通过服务器(假设不安全的包已被删除)。例如,客户机可以重新实现一个方法,但这并不重要,因为meteor只将客户机端方法视为模拟——真正的方法必须在服务器上运行才能产生任何副作用。除非攻击者获得对服务器本身的访问权,否则服务器方法不会受到攻击。