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;
})();
号
注意,这个代码和问题本身一样古老。它可以做得更好,但这是我如何修复它的时间。