javascript - 防止定时器上的 JavaScript 注入(inject)

标签 javascript setinterval xss firebase

我正在制作一个浏览器游戏,每 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/

相关文章:

javascript - 封闭函数变量

php - $_REQUEST 有多邪恶?有哪些可以接受的创可贴对策?

javascript - Angular 5 NullInjectorError : No provider for n

javascript - Webpack 正在压缩我的整个项目,而不是捆绑 js

javascript - 使用静态 html 更新 div

javascript - 在js中循环调用多个setInterval()函数

java - 如何使用 Struts 预防 XSS 漏洞

php - 我找到 XSS 漏洞的方法是一个好的起点吗?

javascript - 如何在进行密集计算时保持动画 gif 运行

javascript - 如何使用setInterval执行函数?