簡體   English   中英

防止在計時器上注入JavaScript

[英]Prevent JavaScript Injection on Timer

我正在做一個瀏覽器游戲,每隔10秒, i就會遞增,並且積分算法使用i來確定所授予的積分數。 對我而言,顯而易見的方法是將setInterval(10000)用於計時器,然后在函數內部運行積分計算。

如何防止JavaScript注入增加 i ,使應用程序認為用戶實際玩的時間比他實際玩的時間長?

我正在使用Firebase作為后端。 作為一個PHP程序員,我通常會在玩家通過檢查開始和結束時間提交分數時,對服務器的分數進行服務器端驗證。 我想我也可以在Firebase中做到這一點,所以我可能只是回答了我自己的問題...

仍然有一種方法可以防止JavaScript注入嗎? 預防 ,不是服務器端檢測 )。

您可以使變量本質上是私有的,這意味着用戶將不可能通過普通的JS注入來更改它們。 但這不會阻止某人使用調試器攔截Javascript,攔截客戶端與服務器之間的通信或進行其他各種擺弄。

要使變量私有,只需將其包含在函數中,執行該函數,然后返回包含引用該變量的函數的內容。 這稱為closure 這很容易做到。

這個小提琴中,有一個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
    };
}());​

您可以通過確保書簽在函數上下文內部,並且不是全局變量並且不能從全局范圍訪問,從而通過書簽之類的操作防止對該變量進行簡單操作。 可以簡單地將其放入這樣的自執行函數上下文中:

(function() {
    var i;

    // code that uses i

    setTimeout(function() {
        more code that uses i
    }, 1000);
})();

在這種情況下,只有第一個功能塊中的代碼才能訪問變量i

請注意,正如其他人所說的那樣,這無法防止更復雜的操作在頁面執行之前實際更改源JavaScript或在調試器中中斷並在那里進行操作,因為沒有辦法防止這些操作,但是它確實阻止了最簡單的操作進入頁面並更改變量的方式(例如從小書簽中)。

實際上,沒有辦法通過在客戶端計算值並隨后推送到服務器端來防止任何形式的高分黑客入侵。 只有混淆和不同的技巧才能使駭客活動或多或少變得復雜,但根本無法阻止。 因此,首選服務器驗證或事件更好的服務器端計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM