Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从HTTP请求执行javascript函数_Javascript - Fatal编程技术网

从HTTP请求执行javascript函数

从HTTP请求执行javascript函数,javascript,Javascript,嗨,我正在尝试从HTTP get请求中获取一个函数。但是,我无法使脚本运行 我的代码是: <!DOCTYPE html> <html> <head> <title></title> </head> <body> <script type="text/javascript"> window.launch = function(url, has_credits) {

嗨,我正在尝试从HTTP get请求中获取一个函数。但是,我无法使脚本运行

我的代码是:

<!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>
这会将我重定向到所述url。我希望javascript有一个内置函数,可以像

func(xmlHttp.response);

然后将触发该功能,但我找不到任何功能,eval没有为我进行训练

eval
应该可以工作,但这对于原型以外的任何东西都是非常糟糕的主意。您尚未设置
responseType
,但我假定您想要
responseText
而不是
response
。我不确定什么类型的
响应
,但它可能是一个缓冲区或类似的东西,这不是您想要的

你可以这样做:

function reqListener () {
  if (xmlHttp.status !== 200) return;
  eval(this.responseText);
}

xmlHttp.addEventListener("load", reqListener);
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
是个坏主意。假设您将API响应改为:

{
  "func": "launch",
  "params": ["http://my-url.com", "False"]
}
然后你可以这样做:

function reqListener () {
  if (xmlHttp.status !== 200) return;
  eval(this.responseText);
}

xmlHttp.addEventListener("load", reqListener);
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。

eval
应该可以工作,但这对于原型以外的任何东西都是一个非常糟糕的主意。您尚未设置
responseType
,但我假定您想要
responseText
而不是
response
。我不确定什么类型的
响应
,但它可能是一个缓冲区或类似的东西,这不是您想要的

你可以这样做:

function reqListener () {
  if (xmlHttp.status !== 200) return;
  eval(this.responseText);
}

xmlHttp.addEventListener("load", reqListener);
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
是个坏主意。假设您将API响应改为:

{
  "func": "launch",
  "params": ["http://my-url.com", "False"]
}
然后你可以这样做:

function reqListener () {
  if (xmlHttp.status !== 200) return;
  eval(this.responseText);
}

xmlHttp.addEventListener("load", reqListener);
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。

您可以看到以下问题:。它可以帮助你解决这个问题。
eval
是你想要的(尽管不推荐这种设计风格)。我有三个字要告诉你:非常糟糕IDEA@Dean永远不要评估从某处加载的javascript源代码。如果服务器受到攻击,并使URL成为指向包含病毒的站点的链接,该怎么办。甚至更糟糕的是,它会发送一段代码,窃取你网站上的密码。Balint:另一方面,所有javascript都是从某处加载的。只要是原始页面交付的同一服务器,就不会产生额外的安全风险。您可以看到以下问题:。它可以帮助你解决这个问题。
eval
是你想要的(尽管不推荐这种设计风格)。我有三个字要告诉你:非常糟糕IDEA@Dean永远不要评估从某处加载的javascript源代码。如果服务器受到攻击,并使URL成为指向包含病毒的站点的链接,该怎么办。甚至更糟糕的是,它会发送一段代码,窃取你网站上的密码。Balint:另一方面,所有javascript都是从某处加载的。只要它与原始页面交付的服务器相同,就不会产生额外的安全风险。事实上,我认为这会很好,因为它只是用于重定向,我只是没有放置它,但要发送请求的URL带有令牌it@DeanChristianArmada我不明白你的评论。你能提供更多的细节,我会让你知道我认为它是否安全。这是一个示例url,我正试图请求,“。。它所做的是,它将重定向到某个URL HttpResponse.text的值是launch('cache.games.com/client.html?game=7bal_-tie&language=JP','False'),因此我正在评估的代码是eval(“launch('cache.games.com/client.html?game=7bal_-tie&language=JP','False'))eval确实有效,谢谢。顺便说一下,它在同一个IP和域中,我的javascript和我请求的后端。是的,这不会改变任何问题。即使是一个简单的API错误也会阻止该页面上JS的进一步执行。另外,
eval
速度较慢,因为它会导致双重解释。不管怎么说,只要你知道潜在的问题,然后继续使用它。好的,字符串解析然后将更好,并使用窗口参数。实际上我认为这将是好的,因为它只是重定向,我只是没有把它,但URL发送一个请求有令牌it@DeanChristianArmada我不明白你的评论。你能提供更多的细节,我会让你知道我认为它是否安全。这是一个示例url,我正试图请求,“。。它所做的是,它将重定向到某个URL HttpResponse.text的值是launch('cache.games.com/client.html?game=7bal_-tie&language=JP','False'),因此我正在评估的代码是eval(“launch('cache.games.com/client.html?game=7bal_-tie&language=JP','False'))eval确实有效,谢谢。顺便说一下,它在同一个IP和域中,我的javascript和我请求的后端。是的,这不会改变任何问题。即使是一个简单的API错误也会阻止该页面上JS的进一步执行。另外,
eval
速度较慢,因为它会导致双重解释。不管怎样,只要您知道潜在的问题,就可以继续使用它。好的,字符串解析会更好,使用窗口作为参数