在javascript中通过ajax保护JSON响应(for(;;);)



我一直在阅读,我知道有类似的问题,但我没有找到我正在寻找的答案。

for(;;);(1);在Ajax响应输出json字符串之前。

现在我想知道的是这将如何工作?我想尝试使用相同的技术,许多著名的网站,如Facebook与for(;;);

在ajax。php文件中我认为需要这样做:

ajax.php

$arr = array("value" => "something", "moreValues" => "moreSomething");
die("for(;;);".json_encode($arr));

现在的响应将是:

for(;;);{"value":"something","moreValues":"moreSomething"}

我现在该怎么处理这个字符串呢?我是否应该为(;;);然后使用JSON.parse(string);(那我为什么还要发送for(;;);在回应中,如果我要直接删除它…?

这将如何帮助我解决安全问题,以及"用户"如何进入for(;;);如果出了什么问题?

我知道我错过了一些东西,我还没有找到任何例子来演示如何执行这个。有人知道吗?如果你发现这个问题是重复的,请参考一个用代码而不是文字演示的例子。谢谢!

我用一些简单的Javascript解决了这个问题,可以这样使用:

$.ajax({
    url: mylink',
    type: 'post',
    complete: function(){
        self.removeAttr('disabled');    
        removeLoading();
    },
    success: function(data){
        s1 = new handleData(data);
        if(s1.getError()){
            return setMsgPopup(s1.getError(),1);
        }
        arr = s1.getResult();
    }
});

下面是handleData类:

var handleData = (function(){
    var result=false;
    var error=false;
    var objSize=0;
    var handleData = function(data){
        fixedData = data;
        arr = data.split('for (;;);'); 
        if(!arr[1]){
            this.result = false;
        }else{
            fixedData = arr[1];
        }
        try{
            this.result = JSON.parse(fixedData);
        }catch(e){
            this.result = false;
        }
        if(this.result){
            if(this.result['t'] == undefined){
                if(this.result['error'] != undefined)
                    this.setError(this.result['msg']);
                else
                    this.setError("An error have occured.");
            }
            if(this.result['error'] != undefined)
                this.setError(this.result['msg']);
            if(this.result['t'])
                delete this.result['t'];            
        }else
            this.setError("An error have occured.");
        this.setSize();
    };
    handleData.prototype.setError = function(msgError){
        this.error = msgError;
    };
    handleData.prototype.getError = function(){
        return this.error;
    };
    handleData.prototype.getResult = function(){
        return this.result;
    };
    handleData.prototype.setSize = function(){
        if(!this.result)
            return;
        var size =0;
        for(key in this.result) {
            if(this.result.hasOwnProperty(key))
                size++;
        }
        this.objSize = size;
    }
    handleData.prototype.getSize = function(){
        return this.objSize;
    };
    return handleData;
})();

注意这段代码和问题本身一样老。可以做得更好,但这就是我当时的做法。

相关内容