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

Google app engine 如何保护GAE服务器端计算逻辑?,google-app-engine,client,client-server,Google App Engine,Client,Client Server,假设我在html表单中有100个字段。填写完所有字段后,将计算一些分数并显示给用户(假设分数值为0到3000) 当用户更改任何字段中的值时,我们向他显示值范围(0-10001001-20002001-3000),没有详细的分数。但一旦按下提交按钮,将显示准确的分数 现在我需要保护逻辑-因此,用户不应该能够理解每个字段如何影响分数。此外,用户不应该使用某些程序来“玩”这些值,并查看分数是如何变化的 我正在考虑以下方法: 使用会话 在服务器端保留分数的当前值 当一个字段中的值发生更改时,向服务器发送

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

当用户更改任何字段中的值时,我们向他显示值范围(0-10001001-20002001-3000),没有详细的分数。但一旦按下提交按钮,将显示准确的分数

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

我正在考虑以下方法:

  • 使用会话
  • 在服务器端保留分数的当前值
  • 当一个字段中的值发生更改时,向服务器发送更改字段名称和新值的请求
  • 在服务器端验证前一个请求何时发送,如果时差太小,则拒绝请求
  • 服务器以新范围应答并保存新值
  • 当按下Submit时,服务器用服务器的分数值进行回复(不要重新计算,按原样计算)。不要经常回答这个问题

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

    对此没有单一的解决方案。您可能会试图让用户很难破解它,并且在未被发现的情况下这么做,并尽可能采取强制措施

    • 在用户显示表单时使用“启用”cookie(或设置会话标志),并在您提交响应之前检查此特定cookie或标志。在提供响应后清除启用码,并且不允许已提交的用户提交
    • 将字段名随机化,并在服务器端检查字段是否具有正确的随机名称
    • 使用cookie检查用户是否已提交表单(很容易失败)
    • 根据流行的HTTP库检查用户代理(并且不允许人们提交表单)
    • 监控同一IP是否提交了大量内容-不精确,但可能表示有可疑之处
    这些是我想到的第一个想法。很可能会有其他有见地的评论。

    对于客户:

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

  • 当请求重新计算时,计算新的分数,但在将计算结果发送回客户端之前添加一个人工延迟。(例如,在向客户端发送回复之前,睡眠1000毫秒)
  • 使用此策略,您可以为用户“播放”值设置最大速率,而不需要会话,也不需要对每个传入请求进行时差检查


    如果您异步地将结果发送回客户端(可能使用),并将睡眠放在TaskQueue worker中,则效果会更好。这样,应用程序引擎调度程序就不会认为您的应用程序需要生成大量实例,因为您的请求处理程序表现出很高的延迟。

    谢谢,Ibrahim。您能澄清一下第2项是如何实现的吗?我假设您正在使用AJAX向服务器发送请求?我将设置一个
    var hasReplyBeenReceived
    标志,当您发送请求时,该标志将设置为
    false
    ,并且在回调方法收到应答后将设置为
    true
    。发送请求的函数将检查此标志,如果该标志仍然为false,则不执行请求。您还可以添加一个计时器,在大约20秒后将此值设置为true,以防服务器无法发送其回复。嗯,由于我使用jQuery,可能我可以参考ajaxStart/ajaxstop。我不熟悉jQuery,但这听起来很有用。:)