5

我一直在学习 Angular.js 并使用Parse作为后端服务。要将数据发布到 Parse RESTful API,您将在请求的标头中传递 REST API 密钥和 App ID,如下所示:

var config = {headers: {"X-Parse-REST-API-Key":"someapikey", "X-Parse-Application-Id":"someappid"}};

$http.post("https://api.parse.com/1/classes/myobject", obj, config).success (
            function(data) {console.log(data);}
);

虽然这对学习很有帮助,但我想知道用于 Parse 的 RESTful API 或任何其他后端即服务供应商如何在真正的 html 应用程序中工作。API 密钥和应用程序 ID 将在 JavaScript 中公开,任何聪明到可以查看源代码的人都可以修改您帐户的数据。

我可以将其映像到工作的唯一方法将涉及添加到 Api Key/App Id 标头的代理服务器。但是,这会破坏不必运行自己的后端服务器的目的。我在这里错过了什么吗?

4

2 回答 2

20

这就是你所缺少的:)

Parse.com 的 REST/JavaScript 键被设计为“不合时宜”。使用这些键,不可能绕过对象访问规则或 beforeSave 验证。只有万能钥匙才能做到这一点。保护万能钥匙。一个有用的类比是公钥加密:您需要共享您的公钥但保护私钥。

任何人都可以修改您的数据吗?是的,但前提是你让他们。用户可以查询属于其他用户的数据吗?是的,但前提是你让他们。Parse 有几种方法可以确保数据的完整性和安全性。

第一个是每个对象的权限。使用 Parse.com Web 界面设置 a) 是否可以动态创建类和 b) 现有类的 CRUD 权限。保护应用程序更简单的步骤之一是禁用任何未明确要求的类权限。例如,在后端创建的对象不需要最终用户可写(或可能可读)。

第二个是访问控制列表(ACL)。在每条记录上设置 ACL。它们指定哪些用户或角色可以读取或写入记录。没有 ACL 的记录是公开的(任何用户都可以找到它)。如果 Sue 创建了一个对她来说应该是私有的记录,那么设置一个 ACL。如果没有万能钥匙,汤姆将无法找到它。

第三是云代码。您可以使用 beforeSave/afterSave 功能强制执行关键任务业务规则和数据验证。确定什么是真正重要的,并确保在这些函数中对其进行验证。在这些函数中显式设置 ACL 也是一个好主意。创建对象时可以传入 ACL,但最终用户可能会篡改这些。

以下是安全性和完整性的总结经验法则。

  • 对象权限应仅在必要时开放以支持您的要求。

  • 每条记录都应该有一个 ACL,除非您确定它不应该。

  • 大多数 ACL 应该使用 before/afterSave 函数进行设置。

  • 任何必须强制执行的验证都应在 before/afterSave 函数中进行检查。

最后一件事:很容易将所有业务逻辑都视为“重要”并坚持“完美的完整性”。对于许多应用程序来说,这太过分了。确保你有足够的服务器端保护,这样一个用户永远不会对你或你的其他用户造成伤害。除了支持成本之外,担心太多没有多大意义。如果有人正在试验您的应用程序,但被阻止有意或无意地干扰他人,也许他们会找到一种全新的方式来使用它:)。

于 2013-08-06T06:56:32.853 回答
2

Parse 提供了几个可以通过不同 API 使用的访问密钥:

  • 客户端密钥(用于 iOS 和 Android 应用程序)
  • Javascript 键
  • 窗口键
  • 休息键
  • 主密钥(用于 REST API 访问,但不符合对象 ACL 权限)

从客户端 javascript 访问 Parse 时,您应该使用带有 Javascript 访问密钥的 javascript API。

在安全方面,您将无法阻止用户使用客户端 javascript 使用的访问密钥。Parse 通过附加到每个对象的 ACL 提供强大的访问控制,允许您将每个类的读/写访问权限限制为指定用户。您还可以阻止客户端在您的应用设置中创建新类。看看这里的安全指南。

于 2013-08-06T05:50:52.300 回答