热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Web安全之同源策略与跨域访问

古语云:“无规矩不成方圆”。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在

古语云:“无规矩不成方圆”。同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

一、怎样才算是同源

所谓同源是指域名(主机名或者IP地址)、端口、协议相同。不同的客户端脚本(JavascriptActionScript)在没明确授权的情况下,不能读取对方的资源。

不同源的例子:
1. 域名(主机名或者IP地址)不同
http://news.company.com/index.htmlhttp://www.company.com/index.html不同源,域名不同,news子域与www子域不同。
http://company.com/index.htmlhttp://www.company.com/index.html 不同源,域名不同,顶级域与www子域不是一个概念。
2. 端口不同
http://www.company.com:8080/index.html
http://www.company.com/index.html不同源,端口不同,8080与默认的80端口不同。
3. 协议不同
https://www.company.com/index.html
http://www.company.com/index.html 不同源,协议不同,httpshttp是不同协议。
同源的例子:
http://www.company.com/a/c/index.html
http://www.company.com/b/d/index.html 属于同源,域名,端口,协议均相同。

二、IE特例

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

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

这些例外都是非标准的,其他也并未作出支持

三、读写权限

Web上的资源有很多,有的只有读权限,有的同时拥有读和写的权限。比如:HTTP请求头里的Referer(表示请求来源)只可读,同源和不同源就是根据这个Referer值进行判断的, 而document.COOKIE则具备读写权限。这样的区分也是为了安全上的考虑。

注意:COOKIE中的同源只关注域名,忽略协议和端口。所以https://localhost:8080/http://localhost:8081/COOKIE是共享的。

四、同源策略示例

如果是打开百度,在控制台中请求CSDN的网页的话,会报下面的异常:
Chrome中会报下面的异常:

Chrome中报的错

IE中会报下面的异常:

IE中报的错

五、跨域访问资源

1. Ajax跨域(CORS)

Ajax主要是通过XMLHttpRequest对象与远程的服务器进行信息交互的。但是XMLHttpRequest受到同源策略的约束,不能跨域访问资源。
如果XMLHttpRequest能够跨域访问资源,则会导致安全问题。因为XMLHttpRequest是一个纯粹的Javascript对象,如果某网站存在漏洞导致XSS注入了Javascript脚本,这个脚本就可以通过Ajax获取用户的信息并通过Ajax提交到其他站点。
但是XMLHttpRequest可以通过访问目标域的服务器,然后目标域的服务器返回的HTTP响应头来授权是否允许跨域访问,假如目标站点http://www.foo.com返回的响应头如下:
Access-Control-Allow-Origin: http://www.evil.com
那么www.evil.com站点上的客户端脚本就有权通过Ajax技术对www.foo.com上的数据进行读写操作。
请求及响应过程如下:
跨域访问请求过程
通过在HTTP Header中加入扩展字段,服务器在相应网页头部加入字段表示允许访问的domainHTTP method,客户端检查自己的域是否在允许列表中,决定是否处理响应。
实现的基础是Javascript不能够操作HTTP Header。某些浏览器插件实际上是具有这个能力的。
服务器端在HTTP的响应头中加入(页面层次的控制模式):

Access-Control-Allow-Origin: evil.com
Access-Control-Request-Method: GET, POST
Access-Control-Allow-Headers: Content-Type, Authorization, Accept, Range, Origin
Access-Control-Expose-Headers: Content-Range
Access-Control-Max-Age: 3600

多个域名之间用逗号分隔,表示对所示域名提供跨域访问权限。”*”表示允许所有域名的跨域访问。

客户端可以有两种行为:
1. 发送OPTIONS请求,请求Access-Control信息。如果自己的域名在允许的访问列表中,则发送真正的请求,否则放弃请求发送。
2. 直接发送请求,然后检查responseAccess-Control信息,如果自己的域名在允许的访问列表中,则读取response body,否则放弃。

本质上服务端的response内容已经到达本地,Javascript决定是否要去读取。

Support: [Javascript Web Applications]
* IE >= 8 (需要安装caveat)
* Firefox >= 3
* Safari 完全支持
* Chrome 完全支持
* Opera 不支持

CORS协议提升了Ajax的跨域能力,但也增加了风险。一旦网站被注入脚本或XSS攻击,将非常方便的获取用户信息并悄悄传递出去。

2. Jsonp实现跨域访问请求(单向跨域)

JSONP(JSON with Padding)是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的Javascript,于是我们可以通过script标记来动态加载其他域的资源。例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以Javascript的形式声明pageA需要的数据,然后在pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数,pageB加载完之后会执行pageA中定义的函数,所需要的数据会以参数的形式传递给该函数。

第一个站点的测试页面(http://localhost:8080/test.html):

标签嵌入跨域脚本。语法错误信息只能在同源脚本中捕捉到 
b.标签嵌入CSS
c.嵌入图片。支持的图片格式包括PNG,JPEG,GIF,BMP,SVG,…
d.嵌入多媒体资源。
e., 的插件。
f.@font-face引入的字体。一些浏览器允许跨域字体( cross-origin fonts),一些需要同源字体(same-origin fonts)。
g.载入的任何资源。站点可以使用X-Frame-Options消息头来阻止这种形式的跨域交互。

六、参考

1. 百度百科:同源策略
2. Javascript 的同源策略
3. 浏览器的同源策略
4. 跨域资源共享的10种方式
5. 同源策略和跨域访问


推荐阅读
  • 用JavaScript实现的太空人手表
    用JavaScript实现的太空人手表-JS写的太空人手表,没有用canvas、svg。主要用几个大的函数来动态显示时间、天气这些。天气的获取用到了AJAX请求。代码中有详细的注释 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • XMLhttpREquest_Ajax技术总结之XmlHttpRequest
    Ajax1、 什么是ajax   ... [详细]
  • 表单提交前的最后验证:通常在表单提交前,我们必须确认用户是否都把必须填选的做了,如果没有,就不能被提交到服务器,这里我们用到表单的formname.submit()看演示,其实这个对于我们修炼道 ... [详细]
  • 但有时候,需要当某事件触发时,我们先做一些操作,然后再跳转,这时,就要用JAVASCRIPT来实现这一跳转功能。下面是具体的做法:一:跳转到新页面,并且是在新窗口中打开时:复制代码代码如下:fu ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
author-avatar
手机用户2502911563
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有