同源策略——浏览器安全卫士

对于软件开发人员来说,理解同源策略。能够非常好地攻克了一个痛点。 不同域名下的资源读写 !

古代的楚河汉界明白地规定了两方的活动界限。假设没有这些界限,天下必将大乱。相同,在我们的浏览器,也有着一些界限和策略,才让 Web 世界之所以能如此美好地呈如今我们面前。这些安全策略有效地保障了用户计算机的本地安全与Web安全。

同源策略

浏览器有一个非常重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议。port同样。不同源的client脚(javascript、ActionScript)本在没明白授权的情况下,不能读写对方的资源。

同源策略,它是由 

from_id=2778944&type=syn&fromtitle=netscape&fr=aladdin" target="_blank" style="color:rgb(40,161,197); text-decoration:none">Netscape 提出的一个著名的安全策略,如今全部支持JavaScript 的浏览器都会使用这个策略。

实际上。这样的策略仅仅是一个规范,并非强制要求,各大厂商的浏览器仅仅是针对同源策略的一种实现。

它是浏览器最核心也最主要的安全功能。假设缺少了同源策略。则浏览器的正常功能可能都会受到影响。能够说Web是构建在同源策略基础之的。

假设Web世界没有同源策略,当你登录Gmail邮箱并打开还有一个网站时。这个网站上的JavaScript就能够跨域读取你的Gmail邮箱数据,这样整个Web世界就无隐私可言了。

cookie 劫持 浏览器中的 cookie就变得很不安全,a 域名下的网页,就能够读取你浏览器中的全部 cookie,假设攻击者能获取到用户登陆凭证的Cookie,甚至能够绕开登陆流程。直接设置这个cookie的值,来訪问用户的账号。

举例说明

安全防御

client的攻击主要来自javascript的脚本,一般体如今对未授权的资源进行读写操作

Web上的资源有非常多。有的仅仅有读权限,有的同一时候拥有读和写的权限。比方:HTTP请求头里的Referer(表示请求来源)仅仅可读。同源和不同源就是依据这个Referer值进行推断的。 而document.cookie则具备读写权限。

这种区分也是为了安全上的考虑。

跨域请求

比方:在 a 页面使用 AJAX 发送一个请求,请求的地址是另外一个网站,

注:

AJAX是Asynchronous JavaScript And XML的缩写。让数据在后台进行异步传输。常见的使用场景有:对网页的局部数据进行更新时,不须要刷新整个网页。以节省带宽资源。

AJAX也是黑客进行Webclient攻击经常使用的技术,由于这样攻击就能够悄无声息地在浏览器后台进行。做到“杀人无形”。

点击查看响应数据:手机归属地 API

假设使用 ajax 发送请求。像以下这样

$.ajax(‘http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?

tel=15850781443‘);

响应数据,oop 报错了

XMLHttpRequest cannot load http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443.
No ‘Access-Control-Allow-Origin‘ header is present on the requested resource. Origin ‘http://www.baidu.com‘ is therefore not allowed access.

由于不同源,浏览器把这个操作给拦截了,然后返回一个错误给用户。

解决的方法

目标网站,假如是http://tcc.taobao.com明白返回HTTP响应头:

Access-Control-Allow-Origin: http://www.evil.com

或者设置为 *, 同意全部站点进行同源訪问,可是这样也太不安全了。

用 jsonp 来解决跨域问题

JSONP(JSON with Padding)是一个非官方的协议。它同意在server端集成Script tags返回至client,通过javascript callback的形式实现跨域訪问(这不过JSONP简单的实现形式)。

举个样例

client 

在client调用提供JSONP支持的URL Service。获取JSONP格式数据。

比方客户想訪问http://www.yiwuku.com/myService?

jsonp=onCustomerLoaded

如果客户期望返回JSON数据:["customername1","customername2"]

那么真正返回到client的 数数据:

callbackFunction([“customername1","customername2"])
<script type="text/javascript">
      function onCustomerLoaded(result, methodName){
          conssole.log(result);//  输出结果 ["customername1","customername2"]
      }
</script>
<script type="text/javascript" src="http://www.yiwuku.com/myService?jsonp=onCustomerLoaded"></script>

server端:

String callback = request.getParameter("callback");
out.println(callback + "(‘" + data+ "‘)");

或者使用 jquery 的ajax 解决方式

$.ajax({
  url: ‘http://localhost:8080/test2/searchJSONResult.action‘,
  type: "GET",
  dataType: ‘jsonp‘,
  data: {name:”ZhangHuihua”}, timeout: 5000,
  success: function (json) {
    //clientjquery预先定义好的callback函数,成功获取跨域server上的json数据后,会动态运行这个callback函数
    alert(json);
  },
  error: function (){
    alert("请求失败!");
   }
});

HTML中的script标签能够载入并运行其它域的JavaScript,于是我们能够通过script标记来动态载入其它域的资源。

JSONP易于实现,可是也会存在一些安全隐患,假设第三方的脚本任意地运行。那么它就能够篡改页面内容,截获敏感数据。可是在受信任的两方传递数据,JSONP是很合适的选择。

jsonp 带来的问题

JSONP为解决跨站问题带来便利的同一时候。也存在一定的潜在风险。以下以实例说明其风险。

比方jsonpTest.htm提供jsonp格式的调用。返回如以下格式的callBack({"json":"jsonTest"})的数据。

  • 脚本注入

    未对回调的函数名以及输入内容进行过两次。

    比方用户输入如以下请求:

    xxx.com/jsonpTest.htm?

    jsonp=alert(‘OK‘);

    则若server只是滤,响应内容为alert("OK");{"json":"jsonTest"}

    假设 jsonp 请求为:

    xxx.com/jsonpTest.htm?jsonp=<img onclick=”xxx”/>

    则若server只是滤,响应内容为:

    <img onclick=”xxx”/>;{xx}

    用户点击图片,也会有xss攻击。

  • 恶意攻击

    对输入的内容进行安全转义过滤,却未限定jsonp回调的合法的字符。以下參数经过安全转义后仍然不变。

    while(true){alert(document.cookie)} 攻击者就能够使用此參数对用户进行恶搞。

  • 解决的方法
    • 对输出的内容进行必要的安全转义
    • 限定jsonp的回调方法名的安全字符范围为(a-zA-Z0-9$ )
    • 设置响应类型是非json或javascript类型,比方text/html。防止攻击者直接输入jsonp请求的url。浏览器端收到数据时以js的方式执行响应的内容。

跨域的很多其它解决的方法

  • 假设是log之类的简单单项通信,新建<img>,<script>,<link>,<iframe>元素,通过src,href属性设置为目标url。实现跨域请求
  • 现代浏览器中多窗体通信使用HTML5规范的targetWindow.postMessage(data, origin);,当中data是须要发送的对象,origin是目标窗体的origin。window.addEventListener(‘message‘,
    handler, false);
    handler的event.data是postMessage发送来的数据,event.origin是发送窗体的origin,event.source是发送消息的窗体引用
  • 内部server代理请求跨域url。然后返回数据
  • 跨域请求数据,现代浏览器可使用HTML5规范的CORS功能,仅仅要目标server返回HTTP头部Access-Control-Allow-Origin: 就可以像普通ajax一样訪问跨域资源

參考文献:

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-08-01 03:35:45

同源策略——浏览器安全卫士的相关文章

同源策略——浏览器的安全卫士

对于软件开发者来说,理解同源策略,可以很好地解决了一个痛点, 不同域名下的资源读写 ! 古代的楚河汉界明确地规定了双方的活动界限,如果没有这些界限,天下必将大乱.同样,在我们的浏览器,也有着一些界限和策略,才让 Web 世界之所以能如此美好地呈现在我们面前,这些安全策略有效地保障了用户计算机的本地安全与Web安全. 同源策略 浏览器有一个很重要的概念--同源策略(Same-Origin Policy).所谓同源是指,域名,协议,端口相同.不同源的客户端脚(javascript.ActionScr

浏览器的同源策略和跨域问题

要理解跨域问题,必须得知道什么是同源策略. 什么是同源策略? 何谓同源:        URL由协议.域名.端口和路径组成. 如果两个URL的协议.域名和端口相同,则表示他们同源.同源策略:        浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性.         从一个域上加载的脚本不允许访问另外一个域的文档属性. 举个例子:        比如一个恶意网站的页面通过iframe嵌入了银行的登录页

浏览器的同源策略和跨域访问

1. 什么是同源策略 理解跨域首先必须要了解同源策略.同源策略是浏览器上为安全性考虑实施的非常重要的安全策略.    何谓同源:        URL由协议.域名.端口和路径组成,如果两个URL的协议.域名和端口相同,则表示他们同源.    同源策略:        浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性.        从一个域上加载的脚本不允许访问另外一个域的文档属性. 举个例子:      

浏览器同源策略,及跨域解决方案

一.Origin(源) 源由下面三个部分组成: 域名 端口 协议 两个 URL ,只有这三个都相同的情况下,才可以称为同源. 下来就以 "http://www.example.com/page.html" 这个链接来比较说明: 对比URL 结果 原因 http://m.example.com/page.html 不同源 域名不同 https://www.example.com/page.html 不同源 协议不同 http://www.example.com:8080/page.htm

JS同源策略和跨域访问

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现. 1. 什么是同源策略 理解跨域首先必须要了解同源策略.同源策略是浏览器上为安全性考虑实施的非常重要的安全策略. 何谓同源: URL由协议.域名.端口和路径组成,如果两个URL的协议.域名和端口相同,则表示他们同源. 同源策略: 浏览器的同源策略,限制了来自不同源的"doc

同源策略和JSONP(概念性)

同源策略 浏览器有一个很重要的概念——同源策略(Same-Origin Policy). 所谓同源是指,域名,协议,端口相同.不同源的客户端脚本(javascript.ActionScript)在没明确授权的情况下,不能读写对方的资源. 同源策略是基于安全考虑的,当前域不能访问其他域的东西.但这也带来一个问题,不同域之间如何协助.    简单的来说,浏览器允许包含在页面A的脚本访问第二个页面B的数据资源,这一切是建立在A和B页面是同源的基础上. 同源策略是由Netscape提出的一个著名的安全策

同源策略和跨域访问

1. 什么是同源策略 理解跨域首先必须要了解同源策略.同源策略是浏览器上为安全性考虑实施的非常重要的安全策略.     何谓同源:         URL由协议.域名.端口和路径组成,如果两个URL的协议.域名和端口相同,则表示他们同源.     同源策略:         浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性. (白帽子讲web安全[1])         从一个域上加载的脚本不允许访问另外一

同源策略与跨域访问

1. 什么是同源策略 理解跨域首先必须要了解同源策略.同源策略是浏览器上为安全性考虑实施的非常重要的安全策略.    何谓同源:        URL由协议.域名.端口和路径组成,如果两个URL的协议.域名和端口相同,则表示他们同源.    同源策略:        浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性. (白帽子讲web安全[1])        从一个域上加载的脚本不允许访问另外一个域的文档

同源策略与JSONP劫持原理

同源策略 浏览器中有两个安全机制,一个浏览器沙盒(Sandbox),另一个就是同源策略(Same Origin Policy,简称SOP) ,下面介绍同源策略.同源是指同协议.同域名.同端口,必须三同,缺一不可.下面列举了一些例子,为方便读者了解哪些是属于同源,下面列举一些案例: 根据这个策略,a.com域名下的JavaScript无法跨域操作b.com域名下的对象.跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的.如下流程图: 流程图1. 流程图2. 不同源也意味着不能通信,