阻止用户在浏览器控制台中更改游戏值
Prevent user from changing game values in the browser console
任何玩家都可以通过浏览器控制台更改纸杯蛋糕的数量,轻松在游戏中作弊。我想知道是否有办法阻止用户这样做。这也发布在github上。
var numberOfCupcakesDisplay = document.getElementById("numberOfCupcakes");
var cupcake = document.getElementById("cupcake");
function updateValues() {
numberOfCupcakesDisplay.innerHTML = amountOfCupcakes.toString();
//displays number of cupcakes to screen
document.getElementById("amountOfToasters").innerHTML = amountOfToasters.toString();
//displays number of toasters to screen
document.getElementById("toasterButton").innerHTML = "        " + Math.round(costOfToasters).toString() + " cc";
//changes cost of toaster every time it is bought by 110%
}
cupcake.addEventListener('webkitAnimationEnd', function(e){
e.preventDefault();
this.style.webkitAnimationName = '';
}, false);
function clickCupcake() {
++amountOfCupcakes;
cupcake.style.animation = "shiftCupcake";
cupcake.style.webkitAnimationName = "shiftCupcake";
}
updateValues();
是的!!正如其他答案所提到的,防止用户从浏览器控制台更改值是不可能的。换句话说,您只是在问如何编写JS代码,这样用户就无法调试它。你总是可以使用一些方法,让那些想在游戏中作弊的人的生活变得艰难。
1.混淆代码。
查看这些链接以获取有关模糊处理的更多信息。
- SO:如何混淆Javascript
- Jsobfuscate.com
2.不要将游戏的控制值存储在全局变量中。
不要将控制值存储在全局变量中。相反,定义一个类,并将这些变量作为它的私有变量。因此,用户必须深入挖掘,才能找到放置断点的位置。
3.最小化/压缩您的java脚本。
混淆或多或少也涵盖了缩小。
您无法阻止这种情况。你能做的最好的事情就是缩小JS,这样玩家就更难找到合适的值来改变。事实上,任何游戏或应用程序都无法阻止这种情况的发生;用户的计算机控制所有的信息,这样他们就可以对它做任何他们想做的事情
防止这种情况发生的唯一方法是在您控制的服务器上进行所有处理。即使如此,玩家也可以在输入数据上撒谎(因此进行瞄准或其他黑客攻击)。
通过浏览器控制台更改纸杯蛋糕的数量
从技术上讲,你可以通过创建一个新的范围来防止这种情况:
(function(){
var cupcakes = 10;
})();
console.log(cupcakes); // ReferenceError: cupcakes is not defined
但请注意,即使有这种保护(即编辑JS源代码),仍然有"作弊"的方法。如果您将结果发送到服务器。。。好吧,如果不是不可能的话,这将更加困难,因为您可以通过XMLHttpRequest
轻松地发送一个简单的HTTP请求。
实际上可能有一种方法可以达到你的目标。但这取决于游戏的逻辑。
如果你可以在服务器上模拟游戏,你可以为蛋糕生成随机ID,当游戏(在客户端上)创建新蛋糕时,它会请求一个ID。稍后,当蛋糕被"销毁"时,它将联系服务器,并向其提供蛋糕的ID。然后,在服务器上根据收到的ID计算最终得分。
通过这种方式,您可以跟踪用户实际做了什么。
但对手可以监听网络请求,并确定创建新ID的请求。同样,他也可以确定请求,告诉服务器该ID已被"销毁"。
如果你的游戏逻辑允许,你可以告诉服务器每5秒左右只生成一个ID。你还可以将所有蛋糕都被"销毁"且没有遗漏的所有结果标记为伪造(如果游戏足够困难的话)。
因此,它仍然不是100%安全的,但您可能能够达到相对较高的欺骗保护级别。另一方面,它增加了许多代码复杂性,您必须权衡利弊。
- 如何使用phaser使html5游戏在移动设备浏览器上运行
- 控制台返回var不是't定义,但它是
- 如何有效地将游戏数据存储在URL查询字符串中
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- Javascript游戏输入失去焦点
- 如何在p5.js中管理多智力竞赛游戏的多个屏幕
- 如何使用Protractor从Chrome控制台获取所有日志
- setInterval游戏循环的范围问题
- 为什么我能够从javascript控制台发送跨域ajax请求
- 当浏览器控制台未打开时,为什么要求会导致Internet Explorer 9超时
- 为网络游戏制作动画
- 重置游戏和获胜者问题
- 在量角器中创建一个.txt错误输出文件是手动的,而不是控制台错误
- 按压“;输入“;将值打印到控制台日志
- 如何让JS脚本在导航后继续运行(谷歌chrome控制台)
- 将数组的拼接分配给自身时,Javascript控制台打印不起作用
- PHP REST服务抛出异常——希望避免控制台错误
- 帆布游戏的滞后运动
- js文件未加载js控制台say's”;不允许加载本地资源”;
- Javascript单独的游戏窗口