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

我一直在阅读,我知道有类似的问题,但我找不到我想要的答案。

因此,在ajax响应输出JSON字符串之前,它是关于(;);while(1);的。

现在我想知道的是这将如何工作?我想尝试使用和许多著名网站一样的技术,比如facebook with for(;;);

所以在ajax.php文件中,我认为必须这样做:

阿贾克斯.php

$arr = array("value" =>"something","moreValues" =>"moreSomething");

die("for(;;);".json_encode($arr));

现在的答案是:

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

我现在该怎么处理这根绳子?我是否应该删除(;);用一个子字符串或其他东西,然后使用json.parse(string);(那么,如果我要直接删除它,为什么还要在响应中发送for(;)。?

这将如何帮助我解决安全问题,如果出现问题,"用户"将如何进入(;;)的无限循环?

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

stackoverflow.com/questions/2669690/…和stackoverflow.com/questions/6339790/…

我已经读了这些文章20遍了,我想用更多的无代码单词来更好的演示。

如果你读过这些问题并回答了20次,你就不会问像What shall I do with this string now?、Then why did I even send the for(;;); in the response if i'm going to remove it directly..?、And how will this help me with security issues, and how will a"user" enter the infinity loop for(;;); if something is wrong?这样的问题了。

如果你知道答案,你能用代码告诉我这是如何工作的吗?

你已经解决了-shall i remove for(;;); with a substr or something and then use JSON.parse(string);。所有事情的推理都在我链接的问题/答案中,代码由您决定,您希望如何实现它。回答只是一根绳子,所以我觉得没问题

您缺少的是,当一个通过标记引用一个URL时,您没有能力修改返回数据的内容,而是按照给定的方式执行。但是,如果通过Ajax检索数据,则可以删除前缀。安全性来自Ajax对Ajax的跨源代码检查。

好吧,开始有点道理了,但我还是被卡住了,你能给我举个例子吗?

它只会重复伊恩链接到的问题中的例子。

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

})();

注意,这个代码和问题本身一样古老。它可以做得更好,但这是我如何修复它的时间。