数据和安全
几乎每一位使用云服务的开发者都会问,如何能够保证自己应用数据的安全?对安全的关注说明你也是位对产品负责、对用户负责、对自己负责、做事态度认真的开发者,这也正是我们所信守的价值观。
云服务所有的 API 请求都通过 SSL 加密传输,保证传输过程中的数据安全性和可靠性。 云端对客户端发过来的每一个请求,都进行了身份鉴别(Authentication)和访问授权(Authorization)的严格检查。
身份鉴别(Authentication)
访问云服务 API 需要提供应用的 AppID 和 AppKey(用于在客户端发起请求),或是 AppID 和 MasterKey(用于在云引擎、开发者自己的服务器等受信任的环境发起请求)。
Android SDK 还额外支持仅使用 AppID 访问云服务 API.
使用 MasterKey 访问云服务 API 会跳过所有的访问权限控制,所以请确保 MasterKey 不会泄露。 万一发生泄露,请立即前往云服务控制台 > 设置 > 应用凭证 > Credentials重置 MasterKey。
在客户端使用 AppKey 访问云服务 API 时:
- 客户端访问 API 通过 HTTPS 加密通讯。
- 通过 SDK 访问 API 时,HTTP Header 中不直接传输 AppKey,而是传输客户端根据 AppKey 和请求发起时间生成的签名字符串,供云端校验。开发者不通过 SDK,直接请求 REST API 时,也可以使用这种更安全的鉴权方式。
通过 HTTPS 加密通讯,不仅保护了数据安全,而且能避免 AppKey 被第三方窃取,但无法阻止别有用心的人通过在客户端使用抓包工具获取 AppKey。
通过签名字符串可以避免在网络传输过程中泄露 AppKey,但是无法阻止别有用心的人通过反编译等手段获取代码中初始化 SDK 时设定的 AppKey。
Android SDK 提供仅使用 AppID 的初始化方式,SDK 通过闭源的 native library 根据开发者配置的应用签名证书自动对请求进行签名。
这在一定程度上避免了暴露应用核心配置信息,也显著增加了破解的难度(反编译 native library 后仍需破解加密算法),但仍无法保证绝对的数据安全。
因此,凡是需要在客户端访问的应用,都需要设定 ACL 等权限设置,以保障应用数据的安全性。
访问授权(Authorization)
云服务支持在 Class(表)、字段(列)、对象三个不同的层次设置访问权限。
Class 权限
Class 权限指整个 Class(整张表)的读写权限,需要在控制台进行设置。
在创建 Class 对话框可以设置 Class 的访问权限:

add_fields- 给 Class 增加新的字段,也就是说,保存对象时,如果对应的字段(列)不存在,是否允许自动创建新的字段。如果已经在控制台创建好 Class 的所有字段,最好对任意用户都关闭此权限,防止脏数据写入。create- 在 Class 表中插入一个新对象。对于需要登录用户或者拥有指定授权的用户才能创建内容的场景,可以考虑根据情况设置此权限。delete- 删除既有对象。update- 修改既有对象。find- 通过指定条件查询对象。关闭此权限时,无法查询对象,只能通过 objectId 获取对象(如果没有同时关闭get权限),一定程度上可以防范别有用心的人批量抓取该 Class 下的所有对象。get- 通过 objectId 获取单个对象。
对于每一种权限,又可以开放给不同用户:
- 所有用户 - 相当于 public 权限。这里的「用户」泛指「客户端」,而不是云服务内建账户系统的用户。也就是说,无论请求是否携带 sessionToken,携带的 sessionToken 是否有效,都可以 进行这一操作,
- 登录用户 - 只有使用云服务内建账户系统(
_User表)并且进行了登录的客户端(携带了有效 sessionToken 的请求),才可以执行这一操作。 - 指定用户 - 指定用户才可以执行这一操作。支持通过用户名、用户的 objectId、角色名、角色的 objectId 指定用户。如果留空,那么意味着所有用户都没有权限。
譬如我们有一个匿名发帖的应用,所有人都可以发表帖子,但是只有经过管理员审核后的帖子才能被展示出来。我们可以有两张表,第一张表用来存放审核前的帖子,这张表的 create 权限就可以开放给所有用户;第二张表用来存放审核后的帖子,这张表的 create 权限就只开放给管理员。
另外,你也可以修改现有 Class 的访问权限。 进入云服务控制台 > 数据存储 > 结构化数据,选择一个 Class,再点击权限标签页。
以 _ 开头的 Class 有一些默认的基本设置。
以用于即时通讯服务的 _Conversation Class 为例:由于即时通讯有封装好的 SDK 和专门的 REST API,客户端几乎没有直接操作相应的结构化数据存储 Class 的需要,所以这个 Class 默认对所有人关闭 Class 访问权限,直接对该 Class 进行的增删查改操作仅限通过控制台或 Master Key 进行。
不过为了兼顾开发测试阶段的便利性以及老应用的兼容性,默认设置比较宽松。
因此,开发者仍然需要根据项目的具体需求,设置这些 Class 的访问权限,才能保障安全。
字段权限
在控制台还可以设置每个字段的权限。 访问