如何保护GAE服务器端计算逻辑?

时间:2012-02-10 17:55:02

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

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

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

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

我正在考虑以下方法:

  1. 使用会话;
  2. 保持服务器端分数的当前值;
  3. 当一个字段中的值更改时,向服务器发送具有更改的字段名称和新值的请求;
  4. 服务器端的
  5. 验证发送上一个请求的时间,如果时间差太小,则拒绝请求;
  6. 服务器回复新范围并保存新值;
  7. 按下提交时,服务器回复分数的服务器值(不重新计算,按原样)。不要经常回复此事。
  8. 还有其他(更好的)方法吗?

2 个答案:

答案 0 :(得分:1)

没有一个解决方案。您可能会尝试让用户难以入侵并且未检测到这种情况并采取可能的强制措施。

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

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

答案 1 :(得分:1)

对于客户:

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

    1. 当重新计算请求到来时,计算新分数,然后在将计算结果发送回客户端之前添加人为延迟。 (例如,在将回复发送回客户端之前休眠1000毫秒)
    2. 使用此策略,您可以为用户设置最大费率以“播放”值,而无需拥有会话,也无需对每个传入请求进行时差检查。

      如果您将结果异步发送回客户端(可能使用Channel API),并将睡眠放入TaskQueue工作器中,那会更好。这样,应用引擎调度程序就不会认为您的应用程序需要生成大量实例,因为请求处理程序会显示高延迟。