Meteor - 保护表单和存储敏感数据的最佳流程是什么

时间:2014-02-11 20:48:01

标签: meteor

我正在使用Meteor构建我的第一个应用程序,我想知道在几种情况下采取的最佳安全措施......

  1. 如何确保用户不会将drop table等命令提交给我的表单?我是否必须以某种方式手动消毒或自动处理?

  2. 通常我会在表单上使用GET,如果它要求用户提供敏感信息,但是我很困惑Meteor如何处理将项目插入数据库。通过表格提交的信息是安全的还是通过人们可以传递的地方?

  3. 如果我删除了自动发布和不安全的软件包,则意味着用户不能只查询其他用户信息,这是正确的吗?

  4. 抱歉,如果这些是noob问题。我还没有完全了解应用程序的安全性如何适合,但任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:6)

以下是保护流星应用程序基础知识的快速概述:

  1. 通过HTTPS传输所有内容。

  2. 将客户端和服务器代码分隔到自己的目录中。保持服务器端机密安全的一个好方法是首先不要将它们发送到客户端。

  3. 删除insecure包。

  4. 删除autopublish包。

  5. 添加audit-argument-checks包并将checks添加到所有方法并发布功能。

  6. 添加browser-policy包(完成以上所有操作后)。


  7. 以下是您的问题的一些答案:

    1. 如果删除了不安全因素并且您没有任何allow规则,则用户无法删除任何内容。无论如何,客户端上的文档只能通过id删除或更新,因此您不能使用单个命令删除集合。

    2. 如果指定了适当的允许规则,则客户端可以执行插入/更新。否则,您可以使用meteor方法让服务器为您执行插入/更新。例如您可以在服务器上指定postsInsert之类的方法。除非您使用SSL,否则消息将以明文形式在客户端和服务器之间传递。

    3. 正确。关闭autopublish后,您需要指定将哪些文档发布到客户端 - 否则客户端将无权读取任何文档。

答案 1 :(得分:0)

如果您不希望用户执行某些操作,则不允许他们这样做。用户可以在数据库上执行的唯一命令是您指定的命令:当您删除不安全的软件包时,键入Collection.remove({});在浏览器控制台中不会删除整个集合,用户将不得不通过Meteor.call某些允许的操作(通过Meteor.methods)来执行仅经过身份验证的内容。

通常,您希望资源的所有者能够编辑/删除它,但其他人不应该能够修改它。 如果您有一个集合的编辑表单,您可能会有相应的Meteor.methods来编辑/删除它。 在Meteor.method中,您可以检查从客户端收到的传递的参数以验证数据的正确性,您还可以验证调用是否是从允许的用户(通常是文档的所有者)发出的。 希望Meteor附带一个Match框架来测试发送给Meteor.methods的参数。

// define a test to check if a document is editable by a certain user
EditableDocument=function(userId){
    return Match.Where(function(documentId){
        var document=Collection.findOne(documentId);
        if(!document){
            throw new Meteor.Error(500,"Document doesn't exist !");
        }
        if(userId!=document.creator._id){
            throw new Meteor.Error(500,"Can't update a document you don't own.");
        }
        return true;
    });
};

Meteor.methods({
    updateCollection:function(documentId,fields){
        check(documentId,EditableDocument(this.userId));
        check(fields,{
            field1:Match.Optional(String),
            field2:Match.OneOf(Number,Boolean),
            field3:Match.Any
        });
        // if the tests pass, do your thing
        ...
    }
});

为了在客户端和服务器之间传递表单数据,Meteor使用DDP(数据分布式协议)和称为远程方法调用的技术。 客户端可以Meteor.call在服务器中声明的Meteor.method并异步获取响应。 这与使用HTTP完成的经典表单子表达操作技术不同,并且可以使用其安全对应的HTTPS来加密客户端和服务器之间的数据,从而避免数据嗅探问题。 DDP支持数据加密,每个* .meteor.com托管站点都使用meteor.com证书,以确保使用SSL正确加密所有流量。 在您自己的托管解决方案中,您必须自己处理这个问题。

https://groups.google.com/forum/#!topic/meteor-core/a9dPA1-mgXA

删除自动发布后,每个服务器资源都不会再发布到所有客户端,这意味着不能只查询您的集合以获取其他用户文档的访问权。

请务必至少阅读一次文档,以完全了解Meteor与Web开发相关的各个方面。