在开发Facebook游戏时,我意识到我还没有想到一种安全的方式来改变用户数据(比如玩家健康状况),我想通过AJAX调用来做。如果我使用参数change_user_health.php
调用{userid : 12345, newhealth : 25}
之类的脚本,我该如何调用它来防止用户偷看脚本并自己调用该脚本,比如给自己完全健康吗?
我原本想要传递散列(可能是某个值的盐渍MD5加密),但是这个散列在调用AJAX脚本文件的JavaScript中是可见的。如果没有用户看到MD5哈希是如何被盐化和组合的,我该怎么做才能调用AJAX PHP脚本?我希望哈希在其组合中包含健康值(在上例中为25),这样用户就不能只使用相同的哈希弹出不同的值(如100)。
答案 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
}
您现在应该探索:
在JS变量中设置秘密哈希(并将其保存在 一个会话)当呈现页面时。
随时发送秘密哈希 提出ajax请求(POST或GET,无论你使用什么)。
首先处理请求 检查请求是否来自 xmlhttprequest,然后确保 与请求一起发送的密钥等于 在会话变量中设置的那个。
祝你好运!