前端安全总结之CSRF

这里主要记录在平常中对知识的学习,经过结合笔记与自身理解的方式尝试写下总结
文章对细节可能不会一一介绍解释,内容仅做参考
复制代码

今天来写学习CSRF的总结~javascript

1、 CSRF(跨站请求伪造)

CSRF是一种挟持用户在当前已登陆的Web应用程序上执行非本意的操做的一种攻击方式html

跨域指的是请求来源于其余网站java

伪造指的是非用户自身的意愿web

简单的说,跨站请求伪造攻击是攻击者经过手段欺骗用户的浏览器去访问用户曾经认证过的网站并执行一些操做(如发送邮件、发消息、甚至财产操做如转帐和购买商品等)。因为浏览器曾经认证过,因此被访问的网站会认为是真正的用户操做而去执行。这利用了web登陆身份认证的一个漏洞:简单的身份认证只能保证请求来自用户的浏览器,但不能识别请求是用户自愿发出的跨域

原理:用户在目标网站进行过登陆并拿到确认后的凭证(如cookie),攻击网站经过携带身份凭证进行对目标网站后台发送请求浏览器

2、 GET CSRF

假设有这样一个场景:目标网站A(www.a.com),恶意网站B(www.b.com)服务器

两个网站的域名不同,目标网站A上有一个删除文章的功能,一般是用户单击'删除文章'连接时才会删除指定的文章。这个连接是www.a.com/blog/del?id=1, id表明不一样的文章。实际上就是发起一个GET请求cookie

若是在目标网站A上存在XSS漏洞,那么能够利用这个XSS漏洞来进行攻击:app

  1. 使用Ajax发起一个GET请求,由于是在目标网站上,因此符合同源策略。请求参数为id=1, 请求目标地址为www.a.com/blog/del
  2. 或者在目标网站A上动态建立一个标签(script, img, iframe等),将其src指向www.a.com/blog/del?id=1, 那么攻击就会发起。实际上经过这种方式发起的请求就是一个GET请求
  3. 最后欺骗用户登陆目标网站A,那么攻击就会发生

若是在目标网站A上不存在XSS漏洞,那么能够利用GET CSRF进行攻击:学习

  1. 没法使用Ajax发起GET请求。由于CSRF请求是跨域的,而Ajax有同源策略的限制
  2. 能够经过在恶意网站B上静态或者动态建立img,script等标签发起GET请求。将其src属性指向www.a.com/blog/del?id=1。经过标签的方式发起的请求不受同源策略的限制(开放策略)
  3. 最后欺骗已经登陆目标网站A的用户访问恶意网站B,那么就会携带网站A源的登陆凭证向网站A后台发起请求,这样攻击就发生了

对比CSRF和XSS攻击能够看出,CSRF攻击有如下几个关键点:

  • 请求是跨域的,能够看出请求是从恶意网站B上发出的
  • 经过img, script等标签来发起一个GET请求,由于这些标签不受同源策略的限制
  • 发出的请求是身份认证后的

3、POST CSRF

假如目标网站A上有发表文章的功能,那么咱们就能够动态建立form标签,而后修改文章的题目。

在网站B中:

function setForm () {
    var form = document.createElement('form')
    form.action = 'www.a.com/blog/article/update'
    form.methods = 'POST'
    var input = document.createElement('input')
    input.type = 'text'
    input.value = 'csfr攻击啦!'
    input.id = 'title'
    form.appendChild(input)
    document.body.appendChild(form)
    form.submit()
}
setForm()
复制代码

上面代码能够看出,动态建立了form表单,而后调用submit方法,就能够经过跨域的伪造请求来实现修改目标网站A的某篇文章的标题了

4、CSRF的危害

CSRF的危害:

  • 利用用户登陆态
  • 用户不知情
  • 盗取用户资金
  • 冒充用户完成操做或修改数据

5、CSRF的防范

  • 禁止第三方网站带Cookies

    设置Cookies中的same-site属性,使之只能在同网站下使用

  • 检测请求头中的Referer字段

    从目标网站A和恶意网站B发出的请求中,请求头惟一的不一样就是Referer字段

    以上面删除文章功能为例,在目标网站A中的Referer字段为http://www.a.com/blog/,而恶意网站B中的Referer字段为http://www.b.com/csrf.html。根据Referer字段与Host字段在同一域名下的规则,能够检测Referer字段值,若是发现其与Host值不在同一域名下,这时候服务器就可以识别出恶意的访问了

  • 添加检验token

    因为CSRF的本质在于攻击者欺骗用户去访问本身设置的地址,因此若是要求在访问敏感数据请求时,要求用户浏览器提供不保存在cookie中,而且攻击者没法伪造的数据做为校验,那么攻击者就没法再执行CSRF攻击。这种数据一般是表单中的一个数据项。服务器将其生成并附加在表单中,其内容是一个随机数。即的形式

    当客户端经过表单提交请求时,这个随机数也一并提交上去以供校验。正常的访问时,客户端浏览器可以正确获得并传回这个随机数,而经过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个随机数的值,服务器端就会由于校验token的值为空或者错误,拒绝这个可疑请求

相关文章
相关标签/搜索