0

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

所以它是关于,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"}

我现在该怎么处理这个字符串?我应该删除 for(;;); 使用 substr 或其他东西,然后使用 JSON.parse(string); (那么为什么我什至在响应中发送 for(;;); 如果我要直接删除它..?

这将如何帮助我解决安全问题,以及“用户”将如何进入无限循环 for(;;); 如果有什么问题?

我知道我遗漏了一些东西,而且我还没有找到任何示例来演示如何执行此操作。任何人?如果您发现此问题重复,请参考一个示例,该示例在 CODE 而不是文字中演示。谢谢!

4

1 回答 1

0

我用一些简单的 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;
})();

请注意,此代码与问题本身一样旧。它可以做得更好,但这就是我当时修复它的方式。

于 2016-09-08T14:42:11.013 回答