从HTTP请求

时间:2016-12-08 09:43:29

标签: javascript

您好我正在尝试从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没有为我锻炼

1 个答案:

答案 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。