【问题标题】:How to use JSONP to overcome XSS issue?如何使用 JSONP 克服 XSS 问题?
【发布时间】:2010-05-27 21:14:37
【问题描述】:

我在码头服务器上执行了一段 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 套接字正在接收帖子,因为当我检查服务器日志时,我在 get 请求中得到 200。

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

【问题讨论】:

  • 这与跨站脚本(XSS)无关;换句话说,这种跨站操作问题并不是XSS这个词所指的。
  • 啊 - 我想我明白了。在 1.5.2 和 1.6.4 版本之间,jQuery 本身开始像这样剥离“空”参数。我不知道为什么,所以我最终可能会记录一个错误。

标签: javascript xss jsonp xmlhttprequest


【解决方案1】:

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

这个想法是您的客户端代码动态创建一个&lt;script&gt; 块,并将“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 }});

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

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

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

【讨论】:

  • 关于“访问您的客户与其他安全站点之间的任何活动会话”...这是正确的吗?我认为它将仅限于发出请求的页面的上下文,而不是不同选项卡/窗口/iframe 中的其他可能打开的站点。
  • 嗯,它是导入到您的页面的 JavaScript,它可以做任何其他 JavaScript 可以做的任何事情。请注意,例如,您的页面可以从 Google 加载类似 jQuery 的内容,并且 jQuery 的副本与从您自己的站点加载的 jQuery 具有一样多的功能。但是你是对的,这一切都是基于每个窗口/选项卡的,所以一个选项卡上的代码对你的家庭银行窗口没有可见性或访问权限(但是,如果它发布到家庭银行网站,浏览器 发送任何打开的会话 cookie 等;这就是 CSRF 攻击所依赖的)。
猜你喜欢
  • 1970-01-01
  • 2018-09-30
  • 2012-11-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2011-09-11
相关资源
最近更新 更多