如何使用HTML5沙箱保护你的站点

分享于 

11分钟阅读

Web开发

  繁體

在10天内开发 Windows 8应用程序。

当今应用的网络将一个新的体验集成到一个体验中。 认为 Twitter 小部件显示关于产品的最新 tweet。 或者Facebook评论讨论一篇文章。 或者甚至只是通过一个的IFRAME元素集成网页。 这些经验可以增加你网站的安全漏洞。

你有一个新孩子在上帮助你 但是,在我达到这一点之前,让我们快速回顾一下元素的问题。

一个 black 框

嵌入带有的内容就像在Facebook上公开一个聚会一样。 你认为你知道你是谁,但真的不知道谁传过来,谁会出现。

框架内容的true 也相同。 你知道你在引用什么但你不知道这个网站将来会如何发展。 ( 或者两者) 可以随时更改的内容或者功能。 没有你的许可,你就 。而且没有你的批准。

使用iframe的安全性问题

浏览器处理使用 IFRAME的页面,就像其他网页一样。 可以使用窗体检索用户输入,可以执行脚本,页面可以在浏览器窗口中导航。 就像那些失去了,crashers hosted hosted的内容将会做什么。

默认情况下,存在一种机制可以防止某些类型的攻击: 跨域策略。

承载来自其他域的内容

如果托管内容来自其他域,则跨域策略将发挥作用,并且它禁止"外部"内容访问父对象模型的文档。

所以,嵌入式页面无法读取,例如,Cookies 或者是宿主域的本地浏览器存储器。 但仍然有一些风险。

托管内容仍然可以在顶层导航。 通过显示用户期望的内容,站点可以尝试从用户那里获取机密信息。 或者,通过使用类似样式的形式,尝试恶意地捕获用户信息。

这就是为什么,即使使用了跨域策略,仍然存在大量的安全风险。

承载来自同一域的内容

在同一个域中托管内容的情况更糟糕。

当内容来自同一域时,没有默认的安全限制。 嵌入的内容可以访问完整加载的浏览器DOM并操作所有内容。

同样的域名上的内容应该是安全的,这是有意义的。 这里的风险主要来自于用户生成的内容,这些内容被托管在 。

沙盒方法

长期以来,标准主体没有正确地解决这些有效的安全问题。 没有明确的W3C标准,一定要确保主机不受框架内容的影响。 例如微软在 8中提供了一个专有的实现 IFRAME security安全性。 其他人拿起它,讨论它,作为他们的浏览器的基线。 但自IE8以来,标准已经。

Modern Chrome。Firefox 和 ) 都基于 W3C IFrame沙箱属性。

下面是我们将使用沙箱构建的内容。 请参见这里的演示

让我们从应用沙箱开始。 只需将它作为空属性添加到 IFRAME元素:


<iframe sandbox src="http://somewebsite.com/default.html"></iframe>



现在, IFRAME sandboxed容器内容被承载在浏览器中,具有以下限制:

  • 插件被禁用任何类型的ActiveX,Flash 或者Silverlight插件都不会执行。
  • Forms disable host主机内容不允许将窗体回发到任何目标。
  • 已经禁用脚本 JavaScript已经禁用并且不会执行。
  • 与其他浏览上下文的链接 定位不同浏览器级别的锚定标记将不会执行。
  • 唯一原始处理。 所有内容均以唯一来源处理。 内容无法遍历DOM或者读取cookie信息。

也就是说,即使来自同一域的内容也使用跨域策略处理,因为每个 IFRAME content内容将被视为唯一的源。

只允许使用收费的内容来显示信息。 不能执行其他操作 inside IFRAME IFRAME可能损害宿主网站或者利用用户的信任 trust。

检查沙箱属性

我们知道 IFRAME 是一个开放的大门。 我们知道沙箱属性会锁定托管内容的安全性。 的决定是清楚的: 只使用沙箱属性使用 元素 !

你可以确认浏览器支持 IFRAME的沙箱属性,并使用简单的JavaScript检查:


if( "sandbox" in document.createElement( "IFRAME" ) ) {


 // render the iframe element...


} else {


 // embed content through other ways,


 // as the browser does not support the sandbox


}



如果它被支持,只需使用沙箱属性。 否则,尝试通过其他方式嵌入内容或者鼓励用户将它的升级到现代浏览器

自定义沙箱

在某些情况下,你需要对限制级别进行一些定制,这是完全可能的。

一些属性值放宽了标准沙箱策略:

允许窗体

如果要在 IFRAME元素中启用窗体回发,则只需指定允许表单属性的表单值 for。


<iframe sandbox="allow-forms" src="xyz.html"></iframe>



如果存在这里值,则允许嵌入页使用窗体内的表单提交回回。

允许脚本

JavaScript是一种强大的语言,通常用于在客户机端进行动态交互,而不会向服务器发送信息。 但是,当托管外部网页时,这种力量也带来风险。 因此,如果你真的想要启用 JavaScript,那么你应该仔细考虑是否要启用 IFRAME场景--特别是当内容来自未知的源代码 source。

启用JavaScript是通过允许脚本值完成的。

<iframe sandbox="允许脚本"src=" xyz.html"> </iframe>

allow-same-origin

默认情况下,同一域中的页具有访问父对象模型的文档的可能性。

沙箱属性就绪后,页面将被视为不属于同一来源。 这里页面对资源没有访问权限,即使来自同一域也是如此。

要在沙盒场景中启用相同的原始处理,你必须指定 allow-same-origin 属性。


<iframe sandbox="allow-same-origin" src="xyz.html"></iframe>



这个值本身并不十分有用,因为你需要一些脚本功能来利用它。

例如如果要访问当前域的本地存储,请执行以下操作:


function loadFromStorage( key ) {


 if( localStorage ) {


 return localStorage.getItem( key );


 }


});



。你还需要允许脚本值:


<iframe sandbox="allow-scripts allow-same-origin" src="xyz.html"></iframe>



现在access工作 !

警告: 允许同一沙箱中的多个脚本可能导致安全漏洞。 例如托管内容可以操作沙箱的属性并删除进一步的限制。

allow-top-navigation

在使用沙盒属性时,锁定其他浏览上下文将被忽略,默认情况下不会执行。 这样可以保护托管 内容的网站被托管内容所取代。

例如如果目标将替换完整的网页,则不会在默认沙箱中执行这里链接:


<a



href="xyz.html" target="_top">Click me</a>



只有信任你所承载的内容时,才建议放宽这里策略。


<iframe sandbox="allow-top-navigation" src="xyz.html"></iframe>



ms-allow-popups

有时,允许嵌入内容打开新的弹出 Windows 是很有用的。 一个完美的例子就是像Bing地图这样的地图服务。

在嵌入,时,可以在弹出 Windows 中查找驱动方向或者目标详细信息的附加功能。 但是由于沙箱禁止这样做,在 IE 10中有一个设置,可以启用弹出窗口而不会破坏沙箱。

下面的代码演示如何设置 ms-allow-popups。


<iframe sandbox="ms-allow-popups" src="xyz.html"></iframe>



设置此值时,嵌入式站点可以在新窗口中显示信息。


<a href="xyz.html" target="_new">Show Info</a>



连接各个部分

可以在一个沙箱上组合几个属性值。 例如如果你想启用窗体 postback,顶级导航和 JavaScript,只需指定

<iframe sandbox="允许表单allow-top-navigation允许脚本"src=" xyz.html"> </iframe>

使用 ,也很好地了解在分层情况下,沙箱的行为正确,使用几个嵌套的IFRAMES 使用不同沙箱属性值。 顶级沙箱始终在层次结构下占主导地位。

请把手打开 !

你可以在中使用这个演示插件来玩 HTML。 你可以从Github下载这个演示的拷贝插件。 要启用 postback 演示,只需在WebMatrix中打开项目文件夹,然后从那里启动项目。

然后,下载一个现代浏览器( 如 IE 10平台预览插件。),并通过阅读IE 开发人员指南来熟悉沙箱。 对一个更安全的站点来说,这个单一属性的收费是一个很大的步骤- -。 而现代浏览器是 finally 准备嵌入嵌入式内容。


Html5  saf  SAN  沙箱  
相关文章