跨站点请求伪造(CSRF)总结和防护

什么是CRSF

构建一个地址,好比说是删除某个博客网站博客的连接,而后诱使已经登陆过该网站的用户点击恶意连接,可能会致使用户经过本身的手将曾经发布在该网站的博客在不知情的状况下删除了。这种构建恶意连接,假借受害者的手形成损失的攻击方式就叫CSRF-跨站点请求伪造。html

浏览器Cookie策略

cookie分类

cookie根据有无设置过时时间分为两种,没有设置过时时间的为Session Cookie(会话cookie),firefoox有标注哪些cookie是会话cookie,这种cookie保存在内存空间中,在浏览器进程的生命周期中都有效,可是一关闭浏览器就被抹除。另一种设置过时时间的叫作third-party Cookie,也称之为本地cookie,保存在本地,在过时时间内均可以使用。chrome

CSRF实现原理

通常用户的操做都须要登陆之后才能进行,csrf就是利用用户的登陆cookie,让用户在本身的恶意网站中向博客网站发送了删除请求。好比让用户点击连接黑客的网站,黑客在网站中加上一个图片连接,该连接实际是向博客网站发送一个删除请求:跨域

恶意网站
 
<html>
 
<p>这是黑客诱导客户访问的恶意网站地址</p>
 
<img src = "http://csdn.com?delete=10">
 
</html>

要实现这个还须要用到用户登陆csdn后的cookie,以前谈同源策略的时候说过,img、iframe之类的标签不受同源策略的影响,因此当向csdn发送请求时,会将csdn相关的cookie都一并提交上去(会提交哪些cookie须要根据cookie做用域来决定),这样csdn验证cookie后误认为是用户在操做,实际上用户是在无心识下删除了本身的文章。浏览器

老版的ie,safari是禁止img、iframe标签请求时发送cookie的,可是最新的firefox以及chrome等主流浏览器都是容许的。服务器

对于老版的ie等是容许发送会话cookie的,若是想发送本地cookie,须要在网站返回给浏览器HTTP头中含有P3P,这样下一次访问网站时将容许发送本地cookie。cookie

同源策略是浏览器实现的,只要请求发出浏览器,同源策略和跨域就用不到了!session


实践

我在本身博客找到一个get请求(博客点赞请求):
在这里插入图片描述
从上图能够看到点赞请求带了一堆cookie验证到后台,如今我写一个新界面,界面里面用img标签跨域访问这个请求(前提是csdn是登陆状态,否则拿不到cookie验证);网站

启动访问本地请求:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面的本地界面确实由于访问csdn的请求而加载了一些csdn的cookie,其中应该包含了登录验证的字段,因此对应的这个服务应该成功了,检查下那篇博客确实多了一个点赞。url


CSRF的防护

方案一 验证码

强制须要客户进行交互才能操做。跟CSRF在客户不知情的状况下完成攻击的方式相饽firefox

方案二 Referer Check

Referer Check最多见的应用就是防止图片盗链,经过查看请求的来源判断请求是否合理,好比经过攻击者的网站嵌入访问博客的地址,那referer就是攻击者网站的地址,这样很大程度能判断出这是一个CSRF攻击,可是这个方法的缺陷是:服务器并非每次都能取到Referer信息。

方案三 构造不可预见性URL

CSRF可以攻击成功,其本质缘由是请求的URL被攻击者猜到,若是请求的URL具备不可预测性,那么攻击者也就无从下手。如今最通用的方式就是在URL中加入一个token参数。token能够存在用户的cookie中,服务器也存有该客户对应的token值。由于CSRF攻击只是利用登陆cookie,并没有法获取cookie的具体值(除非用户还被XSS攻击了,致使cookie泄露,那就无济于事了)。

token应该同时放在提交表单中与服务器session中,在有效时间以内,只要服务器session没有被使用(即用户没有提交表单,这个须要服务器提供一个方案判断某个session是否已经被使用过),都使用同一个token,不然须要从新生成token,并保存到表单和session中。

token也应该注意保密性,不该出如今url中,由于这样能够经过referer获取到,一个尽可能放在表单中,把敏感的操做由GET改成POST,一form表单或者AJAX的形式提交,能够避免token泄露。

方案四: SameSite Cookie,防止 CSRF 攻击

防止 CSRF 攻击的办法已经有 CSRF token 校验和 Referer 请求头校验。为了从源头上解决这个问题,Google 起草了一份草案来改进 HTTP 协议,那就是为 Set-Cookie 响应头新增 SameSite 属性,它用来标明这个 cookie 是个“同站 cookie”,同站 cookie 只能做为第一方 cookie,不能做为第三方 cookie。SameSite 有两个属性值,分别是 Strict 和 Lax
http://www.javashuo.com/article/p-qzhyabmq-bv.html

相关文章
相关标签/搜索