您好我正在尝试从HTTP获取请求中获取功能。但是我不能让脚本运行
我的代码是:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script type="text/javascript">
window.launch = function(url, has_credits) {
if (has_credits != "True"){
if (!confirm(con_str)){
window.close();
}
}
document.getElementById("waiting_msg").innerHTML = "Loading..."
location.href = url;
};
var xmlHttp = new XMLHttpRequest();
theUrl = 'http://127.0.0.1:8000/game/launch/?provider=XXX&game=7bal_tie&token=50c63444b85cdadf5e4b9285c2be5444&jsonp=launch'
xmlHttp.open( "GET", theUrl, true );
xmlHttp.send( null );
//
// The script that will trigger the function
//
</script>
</body>
</html>
请求的返回是
launch("http://my-url.com","False");
哪个应该将我重定向到所述网址。我希望javascript有一个内置函数,可以像
一样轻松运行它func(xmlHttp.response);
然后只会触发功能,但我找不到任何和eval没有为我锻炼
答案 0 :(得分:2)
eval
应该可以工作,但除了原型之外,它不是一个坏主意。您还没有设置responseType
,但我认为您需要responseText
而不是response
。我不确定response
的类型,但它可能是一个缓冲区或类似的东西,这不是你想要的。
你可以这样做:
function reqListener () {
if (xmlHttp.status !== 200) return;
eval(this.responseText);
}
xmlHttp.addEventListener("load", reqListener);
但同样,使用eval
是一个坏主意。我们假设您将API响应更改为:
{
"func": "launch",
"params": ["http://my-url.com", "False"]
}
然后你可以这样做:
function reqListener () {
if (xmlHttp.status !== 200) return;
var respObj = JSON.parse(this.responseText);
window[respObj.func].apply(window, respObj.params);
}
xmlHttp.addEventListener("load", reqListener);
这仍然不理想,因为它可以用于在窗口对象上执行任意代码,但它比直接使用eval
要好一些,因为它限制了漏洞的范围。
这个问题的真正答案是你不应该让你的javascript开放远程代码执行的可能性。因此,请不要在生产中使用此代码,而是重新设计API。