• 浏览器同源策略


    浏览器同源策略

    同源(Same Origin Policy, SOP)的定义

    如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。

    下表给出了相对http://store.company.com/dir/page.html同源检测的示例:

    URL 结果 原因
    http://store.company.com/dir2/other.html 成功
    http://store.company.com/dir/inner/another.html 成功
    https://store.company.com/secure.html 失败 不同协议 ( https和http )
    http://store.company.com:81/dir/etc.html 失败 不同端口 ( 81和80)
    http://news.company.com/dir/other.html 失败 不同域名 ( news和store )

    同源策略允许运行在页面的脚本可以无限制的访问同一个网站(同源)中其他脚本的任何方法和属性。当不同网站页面(非同源)的脚本试图去互相访问的时候,大多数的方法和属性都是被禁止的。

    IE例外

    当涉及到同源策略时,Internet Explorer 有两个主要的不同点

    • 授信范围(Trust Zones):两个相互之间高度互信的域名,如公司域名(corporate domains),不遵守同源策略的限制。
    • 端口:IE 未将端口号加入到同源策略的组成部分之中,因此 http://company.com:81/index.html http://company.com/index.html 属于同源并且不受任何限制。

    源的更改

    document.domain = "domain.com";
    

    使用document.domain来允许子域安全访问其父域时,您需要在父域和子域中设置 document.domain为相同的值。这是必要的,即使这样做只是将父域设置回其原始值。不这样做可能会导致权限错误。

    跨域测试,相同主域名不同子域名下的页面,可以设置document.domain让它们同域。将a.htmlb.html设置相同主域,实现跨域。

    <!-- a.html -->
    <html>
    <body>
        <script type="text/javascript">
            document.domain = 'mark.com:8000';
            var ifr = document.createElement('iframe');
            ifr.src = 'http://b.mark.com:8000/b.html';
            ifr.style.display = 'none';
            document.body.appendChild(ifr);
            ifr.onload = function() {
                var ifrdoc = ifr.contentDocument || ifr.contentWindow.document;
                alert(ifrdoc.getElementsByTagName('html')[0].innerHTML);
            };
        </script>
    </body>
    </html>
    
    <!-- b.html -->
    <script type="text/javascript">
        document.domain = "mark.com:8000";
    </script>
    

    跨源

    使用CORS允许跨源访问。

    阻止跨源

    • 阻止跨域写操作,只要检测请求中的一个不可测的标记(CSRF token)即可,这个标记被称为(CSRF)标记。必须使用这个标记来阻止页面的跨站读操作。

    • 阻止资源的跨站读取,需要保证该资源是不可嵌入的。阻止嵌入行为是必须的,因为嵌入资源通常向其暴露信息。

    • 阻止跨站嵌入,需要确保你的资源不能是以上列出的可嵌入资源格式。多数情况下浏览器都不会遵守 Conten-Type 消息头。例如,如果在HTML文档中指定 <script> 标记,则浏览器将尝试将HTML解析为JavaScript。 当资源不是网站的入口点时,还可以使用CSRF令牌来防止嵌入。

    参考:
    https://www.anquanke.com/post/id/86078
    https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy

  • 相关阅读:
    如何在Element 使用正则表达式校验
    Vs Code 微信小程序 神兵利器合集
    分享CSS公共类库(能在项目快捷使用CSS类)
    Element+Axios上传图片 OR 文件
    两种简洁的数组对象去重姿势
    VScode 格式化代码保存时使用ESlint修复代码
    如何在linux上部署vue项目
    Vue 2.x 3.x 配置项目开发环境跟线上环境
    在Vue文件中引入外部URL链接
    博客目录
  • 原文地址:https://www.cnblogs.com/mark-zh/p/10484339.html
Copyright © 2020-2023  润新知