将javascript变量传递给php变量的安全问题

时间:2012-05-21 10:38:35

标签: php javascript database-security

  

可能重复:
  Preventing fraudulent submission to a scoreboard
  Prevent Cheating on Javascript Game

我找到了一种方法可以将我的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,如果用户访问该页面并且未通知,那么它会破坏cookie并将值存储在我的hiscores中,但如果用户访问主页然后输入上述地址,那么cookie已设置,但他没有玩过游戏,然后还存储了值。

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

编辑:我试图用javascript帖子来做,但是没有用。也许我做错了,有人可以告诉我一个如何做到这一点的例子吗?

3 个答案:

答案 0 :(得分:0)

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

示例:

/sell.php?money=10

上述内容可以通过将10改为1000000来进行攻击。相反,请考虑一下:

/sell.php?itemid=1234

然后服务器处理从播放器库存中删除该项目的情况,并将适当的金额添加到他们的帐户中。

答案 1 :(得分:0)

如果你的游戏完全基于javascript,那么很少有人可以做,除了游戏 补丁周围;高级用户总是会获得高分。

如果您的游戏不时发送一些ajax(在游戏中),您可以获取这些信息并将它们放入 $ _ SESSION ,从而使用它们来更新游戏。 如果在ajax调用之间发送异常值,那么用户就会以某种方式进行黑客攻击。

最后,您可以使用 $ _ SESSION -ed值代替有害网址。 Cookie也可以在用户的​​浏览器中禁用,不要过多依赖它们。

答案 2 :(得分: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 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