博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
同源策略
阅读量:5070 次
发布时间:2019-06-12

本文共 2467 字,大约阅读时间需要 8 分钟。

同源策略限制了一个源(origin)中加载文本或脚本与来自其它源(origin)中资源的交互方式。

同源定义

一.什么是同源策略

   同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略。

  为什么需要同源策略,这里举个例子:

    假设现在没有同源策略,会发生什么事情呢?大家知道,JavaScript可以做很多东西,比如:读取/修改网页中某个值。恩,你现在打开了浏览器,在一 个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问 这个恶意网站并且执行它JavaScript时,你的银行页面就会被这个JavaScript修改,后果会非常严重!而同源策略就为了防止这种事情发 生.  

   比如说,浏览器的两个tab页中分别打开了http://www.baidu.com/index.html和http: //www.google.com/index.html,其中,JavaScript1和JavaScript3是属于百度的脚本,而 JavaScript2是属于谷歌的脚本,当浏览器的tab1要运行一个脚本时,便会进行同源检查,只有和www.baidu.com同源的脚本才能被执 行,所谓同源,就是指域名、协议、端口相同。所以,tab1只能执行JavaScript1和JavaScript3脚本,而JavaScript2不能 执行,从而防止其他网页对本网页的非法篡改。

 

如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就属于同一个源(origin)。

下表给出了相对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 失败 协议不同
http://store.company.com:81/dir/etc.html 失败 端口不同
http://news.company.com/dir/other.html 失败 主机名不同

参见.

源继承

来自about:blank,javascript:和data:URLs中的内容,继承了将其载入的文档所指定的源,因为它们的URL本身未指定任何关于自身源的信息。

IE特例

在处理同源策略的问题上,IE存在两个主要的不同之处。

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

这些例外是非标准的,其它浏览器也未做出支持,但会助于开发基于window RT IE的应用程序。

变更源

页面可以改变本身的源,但会受到一些限制。脚本可以设置 的值为当前域的一个后缀

在同源策略中有一个例外,脚本可以设置  的值为当前域的一个后缀,如果这样做的话,短的域将作为后续同源检测的依据。例如,假设在 http://store.company.com/dir/other.html 中的一个脚本执行了下列语句:

document.domain = "company.com";

这条语句执行之后,页面将会成功地通过对 http://company.com/dir/page.html 的同源检测。而同理,company.com 不能设置 document.domain 为 othercompany.com.

浏览器单独保存端口号。任何的赋值操作,包括document.domain = documen.domain都会以null值覆盖掉原来的端口号。因此company.com:8080页面的脚本不能仅通过设置document.domain = "company.com"就能与company.com通信。赋值时必须带上端口号,以确保端口号不会为null。

附注:使用document.domain来安全是让子域访问其父域,需要同时将子域和父域的document.domain设置为相同的值。必须要这么做,即使是简单的将父域设置为其原来的值。没有这么做的话可能导致授权错误。

跨域网络访问

同源策略控制了不同源之间的交互,例如在使用 或  标签时则会受到同源策略的约束。交互通常分为三类:

  • 通常允许进行跨域写操作(Cross-origin writes)。例如链接(links),重定向以及表单提交。特定少数的HTTP请求需要添加 。
  • 通常允许跨域资源嵌入(Cross-origin embedding)。之后下面会举例说明。
  • 通常不允许跨域读操作(Cross-origin reads)。但常可以通过内嵌资源来巧妙的进行读取访问。例如可以读取嵌入图片的高度和宽度,调用内嵌脚本的方法,或.

以下是一些可以跨域内嵌的资源示例:

  • 标签嵌入跨域脚本。语法错误信息只能在同源脚本中捕捉到。
  •  标签嵌入CSS。由于CSS的,CSS的跨域需要一个设置正确的Content-Type消息头。不同浏览器有不同的限制: , , ,  (跳至CVE-2010-0051)部分 和 。
  •  嵌入图片。支持的图片格式包括PNG,JPEG,GIF,BMP,SVG,...
  •  嵌入多媒体资源。

转载于:https://www.cnblogs.com/xiewei1412125225/p/5523678.html

你可能感兴趣的文章
Jquery实现文本框输入提示
查看>>
HTTP POST GET 本质区别详解
查看>>
http_build_query
查看>>
安装完Apache和PHP之后访问PHP文件页面提示下载而没有解析 解决办法
查看>>
FIR滤波器设计流程 fpga (定点) 流程
查看>>
C# 字符串函数计算
查看>>
Xposed的新打开方式--Xpatch工作流程分析
查看>>
P2598 [ZJOI2009]狼和羊的故事
查看>>
【乱搞】【AOJ-34】Euchre Results
查看>>
about2018001
查看>>
Django--logging配置
查看>>
面向对象
查看>>
MVC调用部分视图PartialView
查看>>
极大似然性估计
查看>>
Apache负载均衡配置
查看>>
ASPOSE.Word 开发资料整理
查看>>
[原创]java读写word文档,完美解决方案
查看>>
实验四、递归下降语法分析实验
查看>>
给一个文件夹,返回该文件夹下所有文件的数量
查看>>
[转载]浏览器的加载与页面性能优化
查看>>