一、什么是同源策略

    同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能。它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

    所谓同源是指,域名,协议,端口相同。(URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。)

二、为什么需要同源策略 

    假设现在没有同源策略,会发生什么事情呢?大家知道,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不能 执行,从而防止其他网页对本网页的非法篡改。
    如果Web世界没有同源策略,当你登录京东账号并打开另一个站点时,这个站点上的JavaScript可以跨域读取你的京东账号数据,这样整个Web世界就无隐私可言了。
    但是,安全性和方便性是成反比的,十位数的密码提高了安全性,但是不方便记忆。同样,同源策略提升了Web前端的安全性,但牺牲了Web拓展上的灵活性。设想若把html、js、css、flash,image 等文件全部布置在一台服务器上,小网站这样凑活还行,大中网站如果这样做服务器根本受不了的,可用性都不能保证的话,安全性还算什么? 所以,现代浏览器在安全性和可用性之间选择了一个平衡点。在遵循同源策略的基础上,选择性地为同源策略“开放了后门”。 例如img script style等标签,都允许垮域引用资源,严格说这都是不符合同源要求的。然而,你也只能是引用这些资源而已,并不能读取这些资源的内容。因此浏览器降低了那么一点点安全性,却大大提升网站布置的灵活性。
所以尽管浏览器遵循同源策略,你仍可以发现你的访问过的网站、买过的东西、搜索过的字串、甚至你的兴趣爱好,都可以被远端分析出来。我们姑且认为这些大数据分析者是有节操的,不会随意泄露这些数据。如果浏览器不遵循同源策略,那么情况更糟:网站站长、广告联盟、流量统计商、xss【注1】 黑客,随便哪个人都将无障碍的获取私密信息,例如各个网站的Cookie、email的邮件内容、OA页面的内容、QQ空间里设置为隐私的照片等,不止这些,听说过CSRF【注2】吗,通过CSRF还可能用你的邮箱群发发邮件、在OA里面填上你旷工一天、在第三方支付平台里自由转账、用你的账号在知乎上胡乱发言,等等。

三、跨域漏洞

    举个例子UC浏览器跨本地域XSS可盗取任意域Cookie ,一段js代码本来是普通http域的权限,可是用过下载页面的一个xss,从而具有了file域的权限,而file域对权限限制也不严格,允许从file域跨到任意一个http域权限去执行js代码,经过了两次跨域操作,最终实现了普通http域向任意一个域注射js的目的,同源策略被完全破坏。


【注1】xss 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
【注2】CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

 
 
 
 
 
 
 
 
 
 
 
 

                             --观千剑而后识器,操千曲而后晓声

最新文章

  1. 【python】装饰器
  2. Win 播放器
  3. C#动态生成html页
  4. Maven仓库管理-Nexus
  5. Autocomplete:属性介绍、firefox中文支持问题
  6. CSS3——动画效果
  7. RT-Thread信号量的基本操作
  8. PHP 5.3.X 连接MS SQL Server php_mssql.dll
  9. 如何通过 OAuth 2.0 使 iOS Apps 集成 LinkedIn 登录功能?
  10. wpf 资源的重用
  11. ★ Linked List Cycle II -- LeetCode
  12. OC - 10.使用Quartz2D绘制个性头像
  13. 《Ruby语言入门教程v1.0》学习笔记-02
  14. Redis架构设计--客户端请求RedisServer时,server端持久化的部分操作
  15. JavaScript实现省市联动
  16. 好用的6个css方法
  17. MySQL 快速复数据库的方法
  18. 性能测试工具——Mxdperfstat
  19. Python基础部分的疑惑解析——运算符和数据类型(5)
  20. 由JDK源码学习ArrayList

热门文章

  1. java Servlet Filter 拦截Ajax请求
  2. Android zxing 解析二维码,生成二维码极简demo
  3. iOS收到Push后播放声音和震动
  4. (Skill)238. Product of Array Except Self
  5. 安装完Pydev却无法创建Python工程
  6. bzoj1051 [HAOI2006]受欢迎的牛
  7. asp.net忘记密码功能
  8. 一、OWIN初探
  9. Spring Boot+Cloud RestTemplate 调用IP或域名
  10. window 10 用composer安装 基于 Laravel 5.3 的 Coaster CMS Curl错误77解决