如何使用JSONP克服XSS问题?

时间:2010-05-27 12:54:27

标签: javascript xss jsonp xmlhttprequest

我在jetty服务器上执行了一段javascript,它正在向另一台服务器(wamp服务器)上的scoket发送XMLHTTPRequest。请求被发送到套接字,但XHR响应似乎被阻止。

我听说我可以使用JSONP来解决这个问题。 但是,由于我不熟悉javascript,而且我从未使用过JSONP技术,因此我非常感谢您对如何使用此技术有任何帮助?

function sendPost(url, postdata, callback) {

xmlHttp=GetXmlHttpObject()

if (xmlHttp==null) {
    alert ("Browser does not support HTTP Request")
    return
} 

xmlHttp.onreadystatechange=callback
xmlHttp.open("POST",url,true)
xmlHttp.send(postdata);

}

function sendInitRQ(width, height) {

var post = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><command     type=\"init\"><width>" + width + "</width><height>" + height + "</height></command>";

sendPost("http://localhost:80/socket.php", post, initReturned);

}

我知道php套接字正在接收帖子,因为当我检查服务器日志时,我在获取请求上得到200.

我只是想知道如何使用JSONP方法? 我已经看到了这种方法的例子,但我仍然不确定如何做到这一点。

1 个答案:

答案 0 :(得分:7)

JSONP技术使用完全不同的机制向服务器发出HTTP请求并对响应进行操作。它需要客户端页面和服务器上的协作代码。服务器必须有一个URL,它响应HTTP“GET”请求,并在函数调用中包含一个JSON块。因此,您不能只对任何旧服务器执行JSONP事务;它必须是明确提供功能的服务器。

我们的想法是,您的客户端代码动态创建<script>块,并将“src”属性设置为JSONP服务器的URL。 URL应包含一个参数,告诉服务器您希望它使用JSON数据调用的Javascript函数的名称。 (确切地说,要使用的参数名称取决于服务器;通常它是“回调”,但我看到一些使用“jsonp”。)客户端当然必须在全局范围内具有该功能。换句话说,如果你有一个像

这样的功能
function handleJSON(json) {
  var something = json.something;
  // ... whatever ...
}

然后你的URL告诉服务器调用“handleJSON”,服务器响应应如下所示:

handleJSON({"id": 102, "something": { "more": "data", "random": true }});

因此,当您从“src”URL加载<script>块时,浏览器将解释内容(来自服务器的响应),并且将调用您的函数。

应该清楚的是,您应该只向您信任的服务器发出JSONP请求,因为它们会发回代码以在您的客户端中执行,并且可以访问您的客户端与其他安全站点之间的任何活动会话。 / p>

编辑 - 这是一篇不错的文章:http://www.ibm.com/developerworks/library/wa-aj-jsonp1/