如何绕过X-Frame-Options: SAMEORIGIN HTTP头?

60

我正在开发一个网页,需要在iframe中显示由另一家公司的SharePoint服务器提供的报告。他们对此没有意见。

我们试图在iframe中渲染的页面却出现了"X-Frame-Options: SAMEORIGIN",这导致浏览器(至少是IE8)拒绝在框架中呈现内容。

首先,这是否是他们可以控制的,还是SharePoint默认会这样做?如果我要求他们关闭此设置,他们能做到吗?

其次,我能否采取措施告诉浏览器忽略此HTTP头并直接呈现框架?

5个回答

37

更新:2019-12-30

看起来这个工具不再可用![请求更新!]

更新 2019-01-06:可以使用我的X-Frame-Bypass Web组件绕过X-Frame-Options<iframe>中。它通过使用多个CORS代理扩展了IFrame元素,并在最新版本的Firefox和Chrome中进行了测试。

您可以按如下方式使用它:

  1. (Optional) Include the Custom Elements with Built-in Extends polyfill for Safari:

    <script src="https://unpkg.com/@ungap/custom-elements-builtin"></script>
    
  2. Include the X-Frame-Bypass JS module:

    <script type="module" src="x-frame-bypass.js"></script>
    
  3. Insert the X-Frame-Bypass Custom Element:

    <iframe is="x-frame-bypass" src="https://example.org/"></iframe>
    

7
这种方法看起来现在被阻止了。 - Karl Glennon
3
@niutech - 这个方法非常有效,感谢你提供的解决方案。 - Samir
1
@niutech 奇怪的问题:有时它能正常工作,有时却失败了。目前还不确定原因。如果我找到了,我会在这里发布。 - Jeroen Wiert Pluimers
1
@JeroenWiertPluimers 试试我的新 X-Frame-Bypass 自定义元素吧! - niutech
16
这完全没有绕过X-Frame-Options选项,它只是使用代理来抓取目标页面并返回没有头信息的内容。它只适用于GET请求,无法获取cookies,只能抓取第三方代理(其中之一为cors.iojsonp.afeld.mecors-anywhere.herokuapp.com)可以访问到的页面(可能会在其中一个站点上留下内容的副本)。由于OP询问Sharepoint,这个连接可能是通过VPN进行的,并且需要cookie,这两者都无法与未经记录的第三方代理一起使用。 - Keith
显示剩余19条评论

37
如果第二家公司允许您在IFrame中访问其内容,那么他们需要取消此限制 - 他们可以在IIS配置中轻松完成此操作。
您无法规避它,任何可行的方法都应在安全热修复中快速修补。如果源内容标头禁止在框架中使用,则不能告诉浏览器仅呈现该框架。这将使会话劫持变得更加容易。
如果内容仅为GET,您不会发布数据,则可以在服务器端获取页面并代理内容而不包含标头,但是任何后续的发布都应该被使无效。

在iframe中显示是不被允许的,但是否有一种方法仍然可以将HTML作为原始字符串获取? - Mike
1
你应该能够爬取它并对标记做任何你想做的事情。 - Legends
3
@Legends,我所指的“代理内容”就是这个意思 :-) - Keith
我可能会重新表达一下;-) - Legends

10

X-Frame-Options头是在浏览器层面上强制执行的安全功能。

如果您能够控制用户群体(例如企业应用的IT部门),那么您可以尝试使用类似于Greasemonkey脚本的东西(如果您能够a)在所有人员中部署Greasemonkey并b)以共享方式部署您的脚本)...

或者,您可以代理他们的结果。 在您的服务器上创建一个端点,让该端点打开与目标端点的连接,并简单地将流量向后导。


9

是的,Fiddler对我来说是一个选择:

  1. Open Fiddler menu > Rules > Customize Rules (this effectively edits CustomRules.js).
  2. Find the function OnBeforeResponse
  3. Add the following lines:

    oSession.oResponse.headers.Remove("X-Frame-Options");
    oSession.oResponse.headers.Add("Access-Control-Allow-Origin", "*");
    
  4. Remember to save the script!

6

至于第二个问题-您可以使用Fiddler过滤器手动设置响应X-Frame-Options头,例如ALLOW-FROM *。但是,当然,这个技巧只对您有效-其他用户仍然无法看到iframe内容(除非他们也这样做)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接