0

可能的重复:
防止欺诈性提交到记分牌
防止在 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 'notcheatated',如果用户访问该页面并且 notcheated isset 那么它会破坏 cookie 并将值存储在我的 hiscores 但如果用户访问主页然后输入上述地址例如然后cookie isset 但他还没有玩过游戏,然后这些值也会被存储。

有人有什么建议来保护我的网站,这样人们就不能只输入他们自己的 hiscores。

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

4

3 回答 3

0

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

例子:

/sell.php?money=10

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

/sell.php?itemid=1234

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

于 2012-05-21T10:48:09.473 回答
0

如果你的游戏完全基于 javascript,那么除了修补补丁外,几乎没有什么可以做的;高级用户将始终获得高分。

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

最后,您可以使用那些$_SESSION -ed 值而不是有害的 URL。Cookies 也可以在用户的​​浏览器中被禁用,不要太依赖它们。

于 2012-05-21T10:56:50.617 回答
0

您至少可以通过发送 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 编码/解码”,例如:

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

于 2012-05-21T11:00:40.223 回答