将 JavaScript 变量传递给 PHP 变量的安全问题


security problems with passing javascript variable to a php variable

可能的重复项:
防止欺诈性提交记分牌
防止在Javascript游戏中作弊

我找到了一种将我的 JavaScript 变量传递给 PHP 变量的方法:

window.location.href = ".../gameover.php?points=" + points+"&speed="+window.speed;

在我使用的gameover.php站点中

$_GET[speed]   // and 
$_GET[points]

以访问我的变量。然后,这些值作为 HiScores 存储到数据库中。但是我的问题来了:如果用户只是键入例如

.../gameover.php?points=500000&speed=85

在地址栏中,它还存储这些变量。

我发现了一些有助于避免这种情况的东西,但你仍然可以绕过它。 在我的主页上,我制作了一个 cookie "缺口",如果用户访问该页面并且 notccited isset 那么它会销毁 cookie 并将值存储在我的 hiscore 中,但如果用户访问主页然后输入上述地址例如,那么 cookie 是设置的,但他没有玩游戏,然后值也会被存储。

是否有人有任何建议来保护我的网站,以便人们不能只输入自己的 HISCORES。

编辑:我试图用一个JavaScript帖子来做到这一点,但没有奏效。 也许我做错了什么,有人可以给我看一个例子,说明我应该怎么做吗?

防止这种情况的唯一方法是在服务器端的 PHP 代码中执行游戏逻辑。如果您将任何点值从客户端发送到服务器,则用户可以作弊。

例:

/sell.php?money=10

以上可以通过将 10 更改为 1000000 来破解。相反,请考虑以下情况:

/sell.php?itemid=1234

然后,服务器会从玩家的物品栏中移除该物品,并将适当数量的钱添加到他们的帐户中。

如果你的游戏完全基于JavaScript,那么除了傻瓜之外,很少有人能做到。周围有补丁;高级用户将始终获得高分。

如果您的游戏不时发送一些 ajax(在游戏中(,您可以获取这些信息并将它们放入 _SESSION 美元,从而也将它们用于更新游戏。如果在 AJAX 调用之间发送了异常值,则用户以某种方式被黑客入侵。

最后,您可以使用这些 $_SESSION 值而不是有害的 URL。Cookie也可以在用户的浏览器中禁用,不要指望太多。

您至少可以通过发送 POST 请求来限制高级用户的可能作弊 - 该请求未显示在地址栏中:https://stackoverflow.com/a/133997/1106393

function post_to_url(path, params, method) {
    method = method || "post"; // Set method to post by default, if not specified.
    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);
    for(var key in params) {
        if(params.hasOwnProperty(key)) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);
            form.appendChild(hiddenField);
         }
    }
    document.body.appendChild(form);
    form.submit();
}

但这是一个糟糕的解决方案,因为它也很容易伪造。

另一种解决方案是在发送值之前对其进行编码。所以它们的意思并不明显。例如,查看Google中的"Javascript Base64 Encode/Decode":

value='1234'      // plain
value='MTIzNA=='  // base64-encoded

用于base64编码的JavaScript函数可以在这里找到:https://stackoverflow.com/a/133997/1106393

在服务器上,您将使用以下方法:

$speed = base64_decode($_POST['speed']);

http://www.php.net/manual/en/function.base64-decode.php