如何通过PHP AJAX调用安全地更改播放器数据?

时间:2011-03-15 14:23:15

标签: php javascript ajax security md5

在开发Facebook游戏时,我意识到我还没有想到一种安全的方式来改变用户数据(比如玩家健康状况),我想通过AJAX调用来做。如果我使用参数change_user_health.php调用{userid : 12345, newhealth : 25}之类的脚本,我该如何调用它来防止用户偷看脚本并自己调用该脚本,比如给自己完全健康吗?

我原本想要传递散列(可能是某个值的盐渍MD5加密),但是这个散列在调用AJAX脚本文件的JavaScript中是可见的。如果没有用户看到MD5哈希是如何被盐化和组合的,我该怎么做才能调用AJAX PHP脚本?我希望哈希在其组合中包含健康值(在上例中为25),这样用户就不能只使用相同的哈希弹出不同的值(如100)。

3 个答案:

答案 0 :(得分:2)

解决方案:将所有内容都放在服务器端。

说,玩家受到了打击。而不是做一个请求发送设置的玩家HP(setPlayerHP(current_hp - damage))

发送请求以通知服务器播放器已被命中,并让服务器处理该请求并在响应中发送剩余的hp。 (playerHit())

然后服务器应该弄清楚是什么击中了他,以及他穿的是什么盔甲。你根本不能信任javascript ...例如,如果你发送了怪物ID以及请求或盔甲id,那么玩家可以很容易地伪造它。

你所拥有的听起来像一个有趣的编程经验:)滞后使事情变得更有趣。

答案 1 :(得分:1)

以下是您可以用来缓解问题的技巧的讨论:How to Check Authenticity of an AJAX Request

答案 2 :(得分:0)

所以你要做的第一件事就是看看请求是否来自ajax请求,例如:

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  // a valid ajax request
} else {
 // not a valid ajax request

}

您现在应该探索:

  1. 在JS变量中设置秘密哈希(并将其保存在 一个会话)当呈现页面时。

  2. 随时发送秘密哈希 提出ajax请求(POST或GET,无论你使用什么)。

  3. 首先处理请求 检查请求是否来自 xmlhttprequest,然后确保 与请求一起发送的密钥等于 在会话变量中设置的那个。

  4. 祝你好运!