想象一下,我们正在使用以下表格构建共享书签应用程序:
用户应该只能访问与其companyID匹配的书签。
传统上,您不会通过不让客户端直接访问数据库来确保这种安全性。相反,您将拥有一个可以对用户进行身份验证的服务器,并且客户端会向服务器发送一个唯一令牌以及对书签的请求。一旦服务器收到此令牌,它就会确切地知道允许用户访问的书签表中的哪些记录。
那很棒,但是如果你没有服务器,并且你想完全依赖CloudKit呢?
由于您没有服务器,因此您似乎必须允许每个用户完全访问“书签”表。然后,客户端代码将负责阻止访问不受限制的记录。 (例如,当您发送检索书签请求时,您将使用谓词,例如companyID == 3
。)
问题是这样的系统有多安全,它允许客户端完全访问,但仅仅基于客户端代码限制它?
(注意:对于这个问题,假设攻击者越狱他们的手机,并使用任何必要的手段来访问他们不允许看到的数据。在我们使用服务器的情况下,我们不会这样做。如果他们越狱他们的手机,请小心,因为所有请求仍然需要通过我们的服务器。他们能够访问他们无法看到的数据的唯一方法是他们是否发现分配给另一个用户的秘密令牌但是,当攻击者可以访问另一个用户的手机时,我假设所有的赌注都已关闭:攻击者将能够找出其他客户端正在使用的秘密令牌,然后访问该用户&# 39;私人数据。因此,我提出的原始问题可以忽略攻击者可以访问另一个人的电话的情况,因为即使在更安全的版本(使用服务器)中,所有投注也都是关闭的。换句话说,假设攻击者只能通过以下问题访问自己的手机。)
我想知道的事情的例子:
@"companyID == %@"
之类的谓词并用变量内容替换%@
,攻击者是否可以在发送查询之前更改此变量的值?@"companyID == 3"
形式的谓词,攻击者是否可以将字符串更改为@"true || companyID == 3"
以便获取所有记录?if companyID != nil { return }
之类的代码。攻击者可以修改他们的客户端,以便它不会执行这行代码吗?如果不使用companyID != nil
,我会使用布尔值companyExists
。会有什么不同吗?bookmark[@"companyID"] = 3
等代码来设置正确的公司ID。例如,如果攻击者将此值更改为4
,则会违反安全规则。他们可以做这种性质的事吗?