微服务中的用户会话管理 第二节同源策略和jsonp、cors

一、同源策略

同源策略(Same Origin Policy):该策略是浏览器的一个安全基石,如果没有同源策略,那么,你打开了一个合法网站,又打开了一个恶意网站。恶意网站的脚本能够随意的操作合法网站的任何可操作资源,没有任何限制。(防止内部资源被外部页面脚本读取或篡改)
浏览器的同源策略规定: 不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源。那么何为同源呢,即两个站点需要满足同协议,同域名,同端口这三个条件。

二、Ajax技术

Ajax 全称 Asynchronous JavaScript + XML,即异步 JavaScript 和 XML。AJAX 本身不是一种新技术,而是用来描述一种使用现有技术集合/标准的新方法,包括:HTML or XHTML、Cascading Style Sheets、JavaScript、The Document Object Model、XML、XSLT 以及 XMLHttpRequest object。AJAX 允许只更新一个 HTML 页面的部分 DOM,而无须重新加载整个页面, 网页应用能够快速地将增量更新呈现在用户界面上,而不需要重新加载整个页面。这使得程序能够更快地回应用户的操作。
(因为json的轻量化以及作为javascript中的一部分,目前json使用比xml更多,两个都被用于Ajax中打包信息)

三、CORS跨域

有些网站由于自身业务的需求,需要实现一些跨域的功能能够让不同域的页面之间能够相互访问各自页面的内容。常见需要跨域的业务场景如下:

1.前端需要调用后端开发的功能接口,前后端分离情况下,域名不一致,会发生跨域访问的问题;
2.需要发送ajax请求,请求另一个页面的内容,其不在同一个域下时,会发生跨域问题;
3.加载第三方网站信息时;
4.子域名需要调用主域名的接口,显示内容时。

CORS 是 H5 提供的一种机制,WEB 应用程序可以通过在 HTTP 报文中增加特定字段来告诉浏览器,哪些不同来源的服务器是有权访问本站资源。

跨域分为两类,简单请求与非简单请求。
满足以下两个条件属于简单请求否则属于非简单请求:
1.请求方法是HEAD GET POST 三种之一;
2.HTTP头信息不超过(Accept,Accept-Language,Content-Language,Lat-Event-ID,Content-Type)这几种字段。
主要按照请求放大进行判断。

1.简单请求
对于简单请求,浏览器发现这一次向服务器提交的请求时简单请求,所以自动增加一个Origin字段
用来表示这次的请求来自哪个域。服务器接收到请求后判断Origin中的域名是否在许可范围内,服务器会在相应包中增加三个CORS相关的字段。

Access-Control-Allow-Origin:该字段是必须存在的,它的值可能是 Origin 字段的值或者是一个通配符“*”,表示可以接受任意域名的请求,当然大部分服务器如果配置了通配符的话,信息泄露的风险骤然加大。

Access-Control-Allow-Credentials:字段不是必选字段,它的值是一个布尔值且只能设置为 true,表示服务器允许浏览器将 cookie 包含在请求中,否则就不添加此字段。但需要注意的是,如果要发送 cookie,Access-Control-Allow-Origin 就不能设为星号,必须明确指定与请求网页一致的域名,同时Cookie依然遵循同源策略。

Access-Control-Expose-Headers:该字段主要是指定想要获取 XMLHttpRequest 对象中 getResponseHeader() 方法的其他服务器字段。

其中Access-Control-Allow-Origin是最重要的。
2.非简单请求
所谓非简单请求就是那种对服务器提出特殊要求的请求,例如请求方法为 PUT 或 DELETE。非简单的 CORS 请求会在正式通信之前,增加一次 HTTP 查询请求,称之为 “预检请求” 。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单里以及可以使用哪些 HTTP 动词和头信息字段。只有获得了肯定响应,浏览器才会正式发出 XMLHttpRequest 请求否则就报错。这种请求的好处是对传统的没有 CORS 支持的服务器减小压力,给服务器一个提前拒绝的机会。
当构造请求包的方法是 PUT 或 DELETE 并传给浏览器时,浏览器发现此请求是非简单请求所以浏览器构造一个预检请求包,请求头是 OPTIONS,并携带三个关键字段:Origin、Access-Control-Request-Method、Access-Control-Request-Headers。其中 Access-Control-Request-Method 表示浏览器的 CORS 请求会用到哪些HTTP方法, Access-Control-Request-Headers 表示浏览器 CORS 请求会额外发送的头信息字段。服务器收到预检请求后,检查了三个核心字段以后如果确定允许跨域请求,会返回一个正常的 HTTP 回应,并携带传入的 CORS 头信息。如果服务器否定请求,虽然也会返回一个正常的 HTTP 回应但是没有任何 CORS 相关的头信息字段,或明确表示请求不符合条件。浏览器根据预请求的返回结果决定接下来是进行简单请求还是拒绝请求

3.漏洞成因及修复
主要是由于

Access-Control-Allow-Origin: *

这样几乎无保护可言

我们可以将设置配置为

1.合理配置Access-Control-Allow-Origin头,不设置为*。
2.设置白名单去限制允许跨域的地址,如Access-Control-Allow-Origin:http://127.0.0.1(只允许127.0.0.1)。
3.配置Access-Control-Allow-Credentials,不要使用true,避免cookie被窃取。
4.配置Access-Control-Allow-Methods时,尽量减少使用的请求方式。
5.仅在接收到跨域请求时才配置有关于跨域的头部,并确保跨域请求是合法的源,以减少攻击者恶意利用的可能性。

四、jsonp劫持
JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案,它是 json 的一种“使用模式”,可以让网页从别的域名(网站)那获取资料,即跨域读取数据。

JSONP 实现的基本原理是利用了 HTML 里 元素标签,远程调用 JSON 文件来实现数据传递。当某网站通过 JSONP 的方式来跨域(一般为子域)传递用户认证后的敏感信息时,攻击者可以构造恶意的 JSONP 调用页面,诱导被攻击者访问来达到截取用户敏感信息的目的。

1.利用过程
用户在网站B 注册并登录,网站B 包含了用户的id,name,email等信息;
用户通过浏览器向网站A发出URL请求;
网站A向用户返回响应页面,响应页面中注册了 JavaScript 的回调函数和向网站B请求的 script 标签,示例代码如下:

<script type="text/javascript">
function Callback(result)
{
    alert(result.name);
}
</script>
<script type="text/javascript" src="http://B.com/user?jsonp=Callback"></script>

用户收到响应,解析 JS 代码,将回调函数作为参数向网站B发出请求;
网站 B 接收到请求后,解析请求的 URL,以 JSON 格式生成请求需要的数据,将封装的包含用户信息的 JSON 数据作为回调函数的参数返回给浏览器,网站B返回的数据实例如下:

Callback({"id":1,"name":"test","email":"test@test.com"})

网站B数据返回后,浏览器则自动执行 Callback 函数对步骤4返回的 JSON 格式数据进行处理,通过 alert 弹窗展示了用户在网站B的注册信息。另外也可将 JSON 数据回传到网站A的服务器,这样网站A利用网站B的JSONP漏洞便获取到了用户在网站B注册的信息。

2.防护方案
1、严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等。

2、严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。

3、严格过滤 callback 函数名及 JSON 里数据的输出。

4、严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法)。

5、其他一些比较“猥琐”的方法:如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值