背景
使用他人提供的公共服务时,发现ajax异步请求发不成功,请教他人后,原来是使用了iframe的sandbox属性的原因。因为iframe经常嵌入第三方服务,如果不加以限制的话,会存在很多安全问题,sandbox就是用来限制第三方嵌入页面操作权限的。
sandbox属性
sandbox有很多属性,目前已经研究的属性有:""、 allow-same-origin、allow-top-navigation、 allow-forms、allow-scripts,接下来分别说下每个属性的作用。
- sandbox=""
表示应用allow-same-origin、allow-top-navigation、 allow-forms、allow-scripts等限制。 - sandbox="allow-scripts"
允许执行script脚本,如果不设置这个值,会有如下提示:
- sandbox="allow-forms"
允许提交表单,如果不设置这个值,会有如下提示:
-
sandbox="allow-top-navigation"
允许更改iframe父页面加载地址,比如iframe里面嵌入一段代码:<a href="https://segmentfault.com/" target="_parent">测试allow-top-navigation</a>
点击就会让父页面重定向到https://segmentfault.com, 如果不设置这个值,会提示如下提示:
- sandbox="allow-same-origin"
表示允许设置http一个header头部:origin,如果设置了allow-same-origin,可以看到origin的准确值,如果没有设置,origin将为null。为null会存在什么问题呢?一是不利于服务端根据origin来设置跨域头部Access-Control-Allow-Origin头部值,二是如果跨域要携带认证信息,比如cookie什么的,跨域头部Access-Control-Allow-Origin必须是某个确定的域名,跟origin是null是冲突的。
总结
以上讲了几个属性值,父页面可以根据iframe嵌入的页面来判断是否需要使用这些操作权限设置;但是如果设置了sandbox属性,就需要保证准确,以免给第三方页面(ps: 尤其是公司内部信任网页)带来问题。
后续。。。
如果以后使用到其他属性,再做补充。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。