背景

使用他人提供的公共服务时,发现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脚本,如果不设置这个值,会有如下提示:
    clipboard.png
  • sandbox="allow-forms"
    允许提交表单,如果不设置这个值,会有如下提示:
    clipboard.png
  • sandbox="allow-top-navigation"
    允许更改iframe父页面加载地址,比如iframe里面嵌入一段代码:

    <a href="https://segmentfault.com/" target="_parent">测试allow-top-navigation</a>

    点击就会让父页面重定向到https://segmentfault.com, 如果不设置这个值,会提示如下提示:

    clipboard.png

  • 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: 尤其是公司内部信任网页)带来问题。

后续。。。

如果以后使用到其他属性,再做补充。


THZXQ
203 声望9 粉丝

前端工程师


引用和评论

0 条评论