【问题标题】:How to protect GAE server-side calculation logic?如何保护 GAE 服务端计算逻辑?
【发布时间】:2012-02-10 17:55:02
【问题描述】:

假设我在 html 表单中有 100 个字段。填写完所有字段后,会计算一些分数并将其显示给用户(假设分数值是从 0 到 3000)。

当用户更改任何字段的值时,我们会显示他的值范围(0-1000、1001-2000、2001-3000),没有详细的分数。但是一旦按下提交按钮,就会显示准确的分数。

现在我需要保护逻辑 - 因此,用户不应该能够理解每个字段如何影响分数。此外,用户不应该能够使用某些程序来“玩”这些值并查看分数是如何变化的。

我正在考虑以下方法:

  1. 使用会话;
  2. 保持服务器端当前分数值;
  3. 当一个字段的值改变时,向服务器发送请求,改变字段名和新值;
  4. 在服务器端验证上一个请求的发送时间,如果时间差太小,则拒绝请求;
  5. 服务器回复新范围并保存新值;
  6. 当提交被按下时,服务器回复分数的服务器值(不要重新计算,按原样)。不要太频繁地回复这个问题。

还有其他(更好的)方法吗?

【问题讨论】:

    标签: google-app-engine client client-server


    【解决方案1】:

    对此没有单一的解决方案。您可以尝试让用户难以破解它并在不被发现的情况下这样做,并采取可能的强制措施。

    • 在用户显示表单时使用“启用程序”cookie(或设置会话标志),并在您提交响应之前检查此特定 cookie 或标志。提供响应后清除启动器,不允许已提交的人提交
    • 随机化字段名称并在服务器端检查字段是否具有正确的随机名称
    • 使用 cookie 来检查用户是否已经提交了表单(很容易破解)
    • 针对流行的 HTTP 库检查用户代理(并且不允许人们使用它们提交表单)
    • 监控同一个 IP 是否提交大量文件 - 不精确,但可能表明有问题

    这些是我想到的第一个想法。很可能会有其他有见地的 cmets。

    【讨论】:

      【解决方案2】:

      对于客户:

      1. 将字段数据发送到服务器,请求计算分数。
      2. 对您的客户端设置一个约束,以便它在发送新请求之前等待服务器完成对第 1 步发送的请求的回复。
      3. 当来自服务器的响应返回时,检查字段中的值,如果与上次执行步骤 #1 相比有任何变化,请重新执行步骤 #1。如果没有,请监控字段并在检测到任何更改时转到第 1 步。

      现在是服务器:

      1. 当请求重新计算时,计算新分数,但在将计算结果发送回客户端之前添加人为延迟。 (例如,在向客户端发送回复之前休眠 1000 毫秒)

      使用此策略,您可以为用户设置一个最大速率来“玩”这些值,而无需进行会话,也无需对每个传入请求进行时差检查。

      如果您将结果异步发送回客户端会更好,也许使用Channel API,然后将睡眠放入 TaskQueue 工作程序。这样一来,应用引擎调度程序就不会认为您的应用需要生成大量实例,因为您的请求处理程序表现出高延迟。

      【讨论】:

      • 谢谢,易卜拉欣。能否请您澄清一下如何实施第 2 项?
      • 我假设您正在使用 AJAX 将您的请求发送到服务器?我会设置一个var hasReplyBeenReceived 标志,当您发送请求时将设置为false,一旦回调方法收到答案,将设置为true。发送您的请求的函数将检查此标志,如果标志仍然为假,则不执行请求。您还可以添加一个计时器,在 20 秒左右后将此值设置为 true,以防服务器无法发送回复。
      • 嗯,因为我用的是jQuery,大概可以参考ajaxStart/ajaxStop
      • 我对 jQuery 不熟悉,但这听起来可以解决问题。 :)
      猜你喜欢
      • 2011-02-17
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      相关资源
      最近更新 更多