可能重复:
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帖子来做,但是没有用。也许我做错了,有人可以告诉我一个如何做到这一点的例子吗?
答案 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']);