我一直在阅读,我知道有类似的问题,但我没有找到我正在寻找的答案。
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;
})();
注意这段代码和问题本身一样老。可以做得更好,但这就是我当时的做法。