从HTTP请求执行javascript函数
嗨,我正在尝试从HTTP get请求中获取一个函数。但是,我无法使脚本运行 我的代码是:从HTTP请求执行javascript函数,javascript,Javascript,嗨,我正在尝试从HTTP get请求中获取一个函数。但是,我无法使脚本运行 我的代码是: <!DOCTYPE html> <html> <head> <title></title> </head> <body> <script type="text/javascript"> window.launch = function(url, has_credits) {
<!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
速度较慢,因为它会导致双重解释。不管怎样,只要您知道潜在的问题,就可以继续使用它。好的,字符串解析会更好,使用窗口作为参数