我正在制作一个浏览器游戏,每 10 秒,i
递增,积分算法使用i
来确定授予的分数。 (对我而言)显而易见的方法是使用 setInterval(10000)
对于计时器,并在函数内部运行积分计算。
如何防止增加的 JavaScript 注入(inject) i
,让应用认为用户实际玩游戏的时间比他实际玩的时间长?
我使用 Firebase 作为后端。作为一名 PHP 程序员,我通常会在玩家提交点数时通过检查开始和结束时间来对玩家点数进行服务器端验证。我想我也可以在 Firebase 中做到这一点,所以我可能只是回答了我自己的问题......
还有,有没有办法阻止 JavaScript 注入(inject)? (预防,而不是服务器端检测)。
最佳答案
您可以使变量本质上是私有(private)的,这意味着用户不可能通过普通的 JS 注入(inject)来更改它们。但这不会阻止某人使用调试器拦截您的 Javascript,拦截您在客户端和服务器之间的通信,或进行各种其他摆弄。
要将变量设为私有(private),只需将其包含在函数中,执行该函数,然后返回包含引用该变量的函数的内容。这称为 闭包
。这很容易做到。
在this fiddle有一个每秒更新一次的 counter
变量(不是每十秒一次——我很着急!:-))和另一个变量 basePoints
加在一起到当前分数。
公开公开的是一个允许您添加到 basePoints 值的函数,但没有任何内容允许您添加到计数器。我认为如果不进入 JS 引擎就无法做到这一点(就像调试器一样)。要点是 Javascript 中没有办法更新 counter
变量。
var app = this.app = (function() {
var counter = 0;
var basePoints = 0;
var div = document.getElementById("score");
var addPoints = function(nbr) {
basePoints += nbr;
display();
};
document.getElementById("add20").onclick = function() {
addPoints(20);
};
var display = function() {
var points = counter + basePoints;
div.innerHTML = points + " points";
};
setInterval(function() {
counter += 1;
display();
}, 1000);
return {
addPoints: addPoints
};
}());
关于javascript - 防止定时器上的 JavaScript 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529994/