如何保护/编码Javascript POST请求

时间:2011-09-05 08:21:07

标签: php javascript ajax security

我有一个游戏,我的JavaScript通过POST调用PHP脚本来更改数据库中的值。如何防止某人反复复制请求并给自己十亿分?

现在我通过sha1()传递密码并检查它是否在PHP端,但这不会阻止有人重复请求。

我无法使用时间戳,因为调用(JS POST请求)和运行PHP脚本之间的时间会过去。


编辑:

  • 我的PHP脚本不会增加数据库值(points = points + 10),它会传递给它的值并更新字段(points = 300)
  • 我在游戏中更新了每个交互上的几个表格(以及导致点数上升的每个交互)。其中一个跟踪每一次投票。此表仅允许用户对任何图像进行一次投票。如果我首先进行此更新,如果用户尝试重复此请求,结果将返回错误,我可以终止PHP脚本。

这是否足够安全?我还需要担心防止重复请求吗?

5 个答案:

答案 0 :(得分:2)

听起来很多这种逻辑现在仍然是客户端,所以你不能阻止某人多次发送“score.php?score = 1000”。

向服务器端添加逻辑,用于检查给定请求执行的频率,或者更好的是,完全在服务器端执行游戏逻辑(因此用户不必提交自己的分数,而只是请求某个游戏要执行的动作,最终导致得分然后可以添加到用户)。

答案 1 :(得分:1)

如果您有某种形式的会话标识符,则可以增加请求的次数。这不是防弹,但清除会话cookie将允许再次发出请求。

您需要某种形式的登录才能阻止某人清除其Cookie,甚至是cURL脚本循环。

编辑:

作为一种权宜之计,您可以添加一种CSRF保护形式,需要将一次性使用的哈希值应用于每个请求以使其有效。

答案 2 :(得分:0)

当你真的想要更新数据库中的值时,你也可以从post发送一个标志,你可以设置为任何值,否则将其设置为0.并且在更新时检查标志的值并相应地更新它。

答案 3 :(得分:0)

鉴于GET或POST都可以由客户轻松完成。如果你只是将原始分数发送到服务器,这永远不会是好事。我从来没有写过一个游戏,客户端会发生那么多逻辑。客户端应该只向服务器发送命令,服务器决定这是否是有效的事务/状态。或多或少,服务器知道客户端的状态,客户端只是反映了这一点。这可能是保证客户正在做的事情是合法的唯一真实方式。

答案 4 :(得分:-3)

使用captcha Wiki CAPTCHAreCAPTCHA

另外,使用Session将我的用户number of repeated requests写入服务器,并在每次成功请求时记下increment,然后阻止用户在session storage data的帮助下访问您的PHP脚本。 PHP SESSIONS