精华内容
下载资源
问答
  • 2022-04-03 13:31:11

    1.Csrf原理:

    1.对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造,比如修改管理员账号时,并不需要验证旧密码,导致请求容易被伪造;v比如对于敏感信息的修改并没有使用安全的token验证,导致请求容易被伪造。
    2.确认凭证的有效期(这个问题会提高CSRF利用的概率)
    3.虽然退出或者关闭了浏览器,但cookie仍然有效,或者session并没有及时过期,导致CSRF攻击变的简单

    2.防御CSRF攻击:

    验证token:form 的最后加上
    验证HTTP请求的Referer,
    还有验证XMLHttpRequests里的自定义header

    3.攻击形式:

    Get:构造链接
    Post:编写一个post.html页面,构造一个链接指向该页面,当用户访问没有结束会话时此页面时,该页面会发起一次攻击请求

    4.Csrf是什么:

    CSRF(Cross-site request forgery),也被称为:one click attack/session riding,中文名称:跨站请求伪造,缩写为:CSRF/XSRF。

    5.CSRF 和 XSS 的区别

    区别一:
    CSRF:需要用户先登录网站A,获取 cookie。

    XSS:不需要登录。
    区别二:(原理的区别)
    CSRF:是利用网站A本身的漏洞,去请求网站A的api。

    XSS:是向网站 A 注入 JS代码,然后执行 JS 里的代码,篡改网站A的内容。

    更多相关内容
  • 主要介绍了详解如何在spring boot中使用spring security防止CSRF攻击,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 安全性测试--CSRF攻击

    2021-02-20 20:08:42
    你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于**商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及...
  • CSRF攻击示意图 客户端访问服务器时没有同服务器做安全验证 防止 CSRF 1.在客户端向后端请求界面数据的时候,后端会往响应中的 cookie 中设置 csrf_token 的值 2.在 Form 表单中添加一个隐藏的的字段,值也是 csrf...
  • 目录:一、CSRF介绍二、CSRF攻击的危害三、CSRF攻击原理及过程四、CSRF漏洞检测五、CSRF漏洞预防六、最后聊聊xssCSRF(Cross-siterequestforgery)跨站请求伪造,也被称为“OneClickAttack”或者SessionRiding,通常...
  • CSRF攻击

    2022-03-18 10:48:13
    CSRF攻击

    1.什么是CSRF攻击

    CSRF——cross-site Request Forgery 跨站点请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

    2.CSRF攻击过程

    --用户A(受害者)正常访问常用网站web1,登陆用户名密码正常访问web1网页

    --web2(攻击网站)会诱导用户进入自己的网站,当用户A进入到web2网站,web2会向

    web1发送一个请求,浏览器会默认携带cookie信息。

    --web1收到请求进行验证,并确认是受害者的凭证,误以为是用户A自己发的请求

    --web1以用户A的名义执行了web2发送过来的请求

    --攻击完成,web2在用户A不知道的情况下对web1进行攻击,并执行自己自定义的操作

    3.防御CSRF攻击方法

    (1)验证 HTTP Referer 字段

    在http的Request Header 中有一个Referer字段,它记录了该 HTTP 请求的来源地址,服务端对每个请求的Referer值进行验证,如果是本网站的地址,则验证通过。如果是第三方网站地址,则拒绝请求。

    验证referer字段的优缺点

    优点:

    1.比较简单

    2.不改变已有代码逻辑,只需要给请求增加前置拦截器进行验证

    缺点:

    1.因为Referer值是由浏览器提供的,将安全性完全依赖第三方浏览器并不安全。因为有些浏览器,例如:IE6和FF2,目前已有一些方法可以篡改Referer值。

    2.即使使用不能随意篡改Referer值的浏览器,这样做还是存在问题,因为Referer值会记录用户访问来源,有些用户认为这样侵犯他们的隐私权,将内部组织机构的信息泄露到外网去。因此用户可以在浏览器中设置发送请求时不再携带Referer值,这样网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。

    (2)在请求地址中增加token

    可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。这种方法相对Referer 比较安全。

    (3)在 HTTP 头中自定义属性并验证

    与方法2相同都是利用token验证,和方法2不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
    然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。

    参考文档:什么是CSRF攻击?如何防御CRSF攻击? - 知乎

    展开全文
  • CSRF定义:跨站请求伪造(英语:Cross-siterequestforgery),也被称为one-clickattack或者sessionriding,通常缩写为CSRF或者XSRF,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。...
  • CSRF攻击示意图 客户端访问服务器时没有同服务器做安全验证 防止 CSRF 攻击 步骤: 1. 在客户端向后端请求界面数据的时候,后端会往响应中的 cookie 中设置 csrf_token 的值 2. 在 Form 表单中添加一个隐藏的的字段...
  • CSRF攻击的应对之道

    2021-01-30 02:15:25
    CSRF(Cross ...然而,该攻击方式并不为大家所熟知,很多网站都有CSRF的安全漏洞。本文首先介绍 CSRF的基本原理与其危害性,然后就目前常用的几种防御方法进行分析,比较其优劣。最后,本文将以实例展示如
  • 什么是CSRF攻击,如何防范CSRF攻击

    一、什么是CSRF攻击
    CSRF攻击的全称为跨站脚本伪造,也称为One Click Attack或者Session Eiding,通常缩写为CSRF或者XSRFCSRF通过伪装来自受信任的用户的请求来攻击受信任的网站。与XSS相比,CSRF攻击往往不太流行(因此对其进行防范的资源也是相当紧缺的)和难以防范的,所以被认为比XSS更具危险性。我们可以这么理解CSRF攻击:首先攻击者会先盗用你的身份,然后以你的名义进行某些非法操作,甚至盗走你的账户购买的商品等。CSRF攻击其值是利用web中用户身份认证验证的一个漏洞:简答的身份验证仅仅可以保证请求发自某一个用户的浏览器,却无法保证请求本身是用户资源发出的。
    二、CSRF攻击的流程
    在这里插入图片描述
    CSRF攻击原理过程如下:

    1、用户C打开浏览器,访问安全网站A,输入用户名和密码请求登录网站A.
    2、在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录A成功,可以正常发送请求到网站A3、用户没有退出A之前,在同一个浏览器中,打开一个Tab页面来访问网站B.
    4、网站B接收到用户的请求后,返回一些攻击代码,并且发出一个请求要求访问第三方站点A.
    5、浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发出的,所以会根据用户C的cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
    

    从上述的流程可以看出,想要达成CSRF攻击,必须达成两个基本条件。

    1、登录受信任网站A,并且在本地生成Cookie。
    2、在不退出登录网站A的前提下,访问危险网站B.
    

    三、常见的CSRF攻击
    1、GET类型的CSRF

    银行站点A: 它以GET请求的方式来完毕银行转账的工作:如http://www.mybank.com.Transfer.php?toBankId=11&money=1000
    危险站点B:其中存在一段html代码为<img src=http://www.mybank.com/Transfer.php?toBankId=11&1000>
    首先你登录了银行站点A,然后访问危险站点B,这时你就会发现自己的银行账号少了1000元。为什么会这样呢?原因是银行站点A违反了HTTP规范,使用GET请求更新资源。在訪问危急站点B的之前,你已经登录了银行站点A,而B中的 一个合法的请求,但这里被不法分子利用了)。所以你的浏览器会带上你的银行站点A的Cookie发出Get请求,去获取资源以GET的方式请求第三方资源(这里的第三方就是指银行站点了,原本这是http://www.mybank.com/Transfer.php?toBankId=11&money=1000 ,结果银行站点服务器收到请求后,觉得这是一个更新资源操作(转账操作),所以就立马进行转账操作。
    

    2、POST类型的CSRF

    这种类型的CSRF危害没有GET类型的大,利用起来通常使用的是一个自动提交的表单,如
    <form action=http://wooyun.org/csrf.php method=POST>
        <input type="text" name="xx" value="11" />
    </form>
    <script> document.forms[0].submit(); </script> 
    访问该页面后,表单会自动提交,相当于模拟用户完成一次POSt操作。
    

    四、CSRF测试
    检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本可以确定存在CSRF漏洞。随着对CSRF漏洞研究的不断深入,不断涌现一些专门针对CSRF漏洞进行检测的工具,比如CSRFTester,CSRF Request Builder等,以CSRF Tester工具为例,CSRF漏洞检测工具的测试原理如下:使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息(比如说更改Referer字段的信息),重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。
    五、预防CSRF攻击
    5.1、验证HTTP Referer字段
    还拿上述的银行转账的例子来说,首先我们向银行站点发出一个请求时,此时HTTP协议头部会携带Referer字段,其中包含着请求该站点的域名,此时如果我们在访问银行站点时并且向银行发出请求,此时携带的Referer就是mybank.com,如果此时我们从存在危险的网站B向银行站点发起请求,此时的Referer就是危险网站B的域名。所以我们可以通过判断Referer来进行判断是否可以执行操作。这样就会很简单的就防止了CSRF,但是任然存在一些问题,比如说我们通过检查Referer来判断域名,这种决策权在浏览器,此时如果一些浏览器对于Referer的值是可改写的,那么CSRF的攻击任然有效。还存在一些用户会禁用Referer字段,此时就会造成无法请求网站数据。
    验证Referer方式总计:
    优点:使用方便,开发简单,一定程度上能预防CSRF攻击
    缺点:这种机制完全依托于浏览器,Referer字段容易被故意篡改,或者被禁用。
    5.2、添加token验证
    我们可以当用户请求时,在安全站点A中生成一个SessionId,保存在服务器端,该值可以作为token传递给客户端。客户端可以设置一个隐藏的input框,其中的值为该token,当我们进行请求时,就会将该值传入到站点A的服务器,此时在服务器端就可以进行比较生成的token和保存的token是否一样,如果一样的话,就表示是从安全站点上发出的请求,就做出具体的相应。在危险网站B就无法拿到token,所以也就无法进行正确的请求了。如果使用的是post请求,我们可以放入隐藏的input框中,如果要是get请求,则我们可以如下写法。例如https://www.myBank.com?token=XXXXX。那么一个网站中存在很多请求,此时我们如果每一个都设置token,则就会显得非常的笨拙。此时我们可以遍历全部的dom,获取全部的a标签和form标签,进行添加就行了。但是如果页面的DOM是动态生成的,则需要程序员自己编写代码将token放入。还存在一个问题就是:如何才能保证token不被攻击者截获。
    添加token方式总结:
    安全程度比Referer更高
    实现方式上稍微复杂
    需要保证token存储的安全性
    5.3、在HTTP头中自定义属性并验证
    这种方法也是保存token,但是其实和上述不同的是,其在HTTP头部保存token,我们可以一次性给访问该网站的请求都加上该自定义字段,但是如何将数据存放在HTTP中呢?此时我们就需要另一个模块,XHRHTTPRequest,当我们使用该模块时,存在另一个弊端,就是只能是异步请求。其他请求都是无法访问的。另外,对于没有进行 CSRF防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。
    验证head方式总结:
    1、使用方式简单,不容易泄漏
    2、使用地方局限

    展开全文
  • 主要介绍了Python Django框架防御CSRF攻击的方法,结合实例形式分析了Python Django框架防御CSRF攻击的原理、配置方法与使用技巧,需要的朋友可以参考下
  • 在移动互联网时代,前端人员除了传统的XSS、CSRF等安全问题之外,又时常遭遇网络劫持、非法调用HybridAPI等新型安全问题。当然,浏览器自身也在不断在进化和发展,不断引入CSP、Same-SiteCookies等新技术来增强安全...
  • 如何防止CSRF攻击

    千次阅读 2022-01-30 19:11:52
    一个典型的CSRF攻击有着如下的攻击流程: 受害者登陆a.com,并保留了登陆凭证(cookie) 攻击者引诱受害者访问了b.com b.com向a.com发送了一个请求: a.com/act=xxx。浏览器会默认携带a.com的cooki

    什么是CSRF

    CSRF(cross-site request forgery)跨站请求伪造:攻击者诱导受害者进去第三方网站,在第三方网站,向被攻击网站发送垮站请求,利用受害者在被攻击网站已经获取的登陆凭证。绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作。

    一个典型的CSRF攻击有着如下的攻击流程:

    • 受害者登陆a.com,并保留了登陆凭证(cookie)
    • 攻击者引诱受害者访问了b.com
    • b.com向a.com发送了一个请求: a.com/act=xxx。浏览器会默认携带a.com的cookie
    • a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误认为是受害者自己发送的请求
    • a.com以受害者的名义执行了act=xxx
    • 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作

    几种常见的攻击类型

    GET类型的csrf

    GET类型的CSRF非常简单,只需要一个http请求即可,一般会这样利用。

    https://a.com/mit-x/blog-images-bundle-2018b/ff0cdbee.example/withdraw?amount=10000&for=hacker
    

    在受害者访问含有这个img的页面后,浏览器会自动向这个地址发出一次HTTP请求。

    post类型的csrf

    这种类型的csrf利用起来通常是一个自动提交的表单,如:

    <form method="post" action="https://bank.example/withdraw"> 
       <input type="hidden" name="account" value="xiaoming" />
       <input type="hidden" name="amount" value="10000" />
       <input type="hidden" name="for" value="hacker" />
    </form>
    <script>document.forms[0].submit();</script>
    

    访问该页面后,表单会自动提交,相当于一次模拟post请求。
    post类型的攻击通常比get要求更严格一些,但是并不复杂,任何个人网站,博客,被黑客上传的页面网站都有可能是攻击的来源,后端接口不能将安全寄托在仅允许post上面。

    链接类型的csrf

    链接类型的csrf不常见,比起上面两种用户打开就中招的。这种需要用户点击才会触发,这种类型通常是在论坛发布的图片中嵌入恶意链接,或者以广告的形式诱导用户中招,攻击者通常会以比较夸张的词语诱骗用户点击

     <a href="http://test.com/csrf/withdraw.php?amount=1000&for=hacker" taget="_blank">
      重磅消息!!
      <a/>
    

    由于之前用户登陆了信任的网站A。并且保存登陆状态,只要用户主动访问上面这个页面。则表示攻击成功

    CSRF的特点

    • 攻击一般发起在第三方网站,而不是被攻击的网站,被攻击的网站无法预防发生
    • 攻击者利用受害者的凭证进行请求操作,而不是直接窃取数据
    • 整个过程并不能获取受害者的登陆凭证,仅仅是冒用
    • 跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入第三方论坛、文章中,难以追踪。
      CSRF通常是跨域的,因为外域通常更容易被攻击者掌握,但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击者可以在本域进行,这样更加危险。

    防护策略

    CSRF通常从第三方网站发起,被攻击的网站无法防止攻击发生,只能通过增加自己网站对CSRF的防护能力来提升安全性

    • CSRF通常发生在第三方域名
    • CSRF攻击者不能获取到cookie,只能使用
      针对这两点,我们可以采用以下策略:
    • 阻止不明外域的访问
      • 同源检测
      • Samesite cookie
    • 提交时要求附加本域才能获取的信息
      • CSRF token
      • 双重cookie验证
        以下是我们的详细说明

    同源策略

    既然csrf大多来自第三方网站,那我们就直接禁止不受信任的域名对我们发起请求。

    那么我们如何判断请求是否来自外域呢?
    在http协议中,每个异步请求都会携带两个header,用户标记来源域名

    • origin Header
    • Referer Header
      这两个Header在浏览器发起请求时,大多数情况会自动带上,并且不能由前端自定义内容,服务器可以通过解析这两个header中的域名,确定请求的来源域。

    使用Origin Header确定来源域名

    在部分与CSRF有关的请求中,请求的Header会带上origin字段,字段内包含请求的域名。
    如果origin存在,那么直接使用origin字段确定来源域名即可。
    但有时候origin有下面两种情况不存在

    • iE11 同源策略: Ie11不会在跨站cors请求上添加origin头,referer头仍是唯一标识,最根本原因是IE11对同源的定义和其他浏览器不同
    • 302重定向:在302重定向之后origin不包含在重定向的请求中,因为origin可能会被认为是其他源的敏感信息。对于302重定向的情况来说都是重定向到新的服务器URL上。因此浏览器不想将origin泄漏到新的服务器上

    使用Referer Header来确定来源域名

    根据HTTP协议,在http头中有一个字端叫referer,记录了该HTTP请求的来源地址,对于Ajax请求,图片和script等资源请求,Referer为发起请求的页面地址。对于页面跳转,referer为打开页面历史记录的前一个地址,因为我们使用Referer中链接的origin部分可以得知请求的来源域名。

    这种方法并非万无一失,referer的值是由浏览器提供的,虽然Http协议上有明确的要求。但是每个浏览器对于Referer的具体实现可能有差别,并不能保证浏览器自身没有漏洞,使用验证referer值的方法,就是把安全性都依赖于第三方(即浏览器)来保证,从理论上讲,这样并不是很安全,在部分情况下,攻击者可以隐藏,甚至修改自己请求的referer。

    无法确认来源域名情况

    当origin和referer头文件不存在时该怎么办?如果origin和referer都不存在,建议直接进行阻止,特别是如果没有使用CSRF Token(参考下方)作为第二次检查。

    如何阻止外域请求

    通过Header的验证,我们可以知道发起请求的来源域名,这些来源域名可能是网站本域,或者有授权的第三方域名。又或者来自不可信的未知域名。我们直接阻止掉这些请求,就能预防CSRF攻击了吗?

    但是,当一个请求是页面请求(比如网站的主页),而来源是搜索引擎的链接(例如百度的搜索结果),也会被当成一次csrf攻击。所以在判断的时候需要过滤页面请求,通常header符合以下情况

    Accept: text/html
    Method: GET
    

    但相应的,页面请求就暴露在了CSRF的攻击范围之中,如果你的网站中,在页面GET请求中对用户做了什么操作的话,防范就失效了。

    例如:GET https://example.com/addComment?comment=xxx&order=orderId
    这种严格来说并不一定存在CSRF攻击的风险,但仍然有很多网站经常把主文档GET请求挂上参数来实现产品功能,但是这样做对于自身来讲是存在安全风险的。

    另外,CSRF一般来自第三方域名,但是也有可能是同域的,比如攻击者有权限在本域发表评论(含链接、图片,统称UGC等),那么他可以直接在本域发起攻击,这种情况下同源策略无法发挥作用。

    综上所述,同源验证是一个相对简单的防范方法,能够防范绝大多数的csrf攻击,但这并不是万无一失的,对于安全性较高,或者有较多用户输入的网站,我们就要对关键的接口做额外的防护。

    CSRF Token

    CSRF另一个特征是攻击者无法获取用户的信息(cookie,header,网站内容等)仅仅是冒用cookie中的信息。

    而CSRF攻击之所以能够成功,是因为服务器误把攻击者的请求当成用户自己的请求,那么我们可以要求所有用户都携带一个CSRF攻击者无法获取到的token,服务器通过校验请求是否携带正确的token,来把正常的请求和攻击的请求分开,也可以防范csrf的攻击。

    原理

    csrf Token的防护策略分为3个步骤

    将CSRF Token输出到页面中

    首先用户打开页面的时候,服务器给这个用户生成一个token,该token通过加密算法对数据进行加密。一般token都包含随机字符串和时间戳的组合。显然在提交的时候不能再放cookie中了,不然又会被攻击者冒用,因为为了安全起见,token就存在服务器的session中,之后每次加载页面的时候,使用js添加dom中所有的a和form标签加入token。这样就可以解决大部分请求,但是在动态生成的html,这种方法就没有作用,需要手动添加。

    页面提交请求携带这个token

    对于GET请求,Token将附在请求地址之后,这样URL就变成了,http://url?csrftoken=tokenvalue
    而对post 请求来说,要在form的最后加上:

    <input type="hidden" name="csrftoken" value="tokenvalue" />
    

    这样就把token以参数的形式加入请求了

    服务器验证token是否正确

    当用户从客户端得到了token,再次提交服务器的时候,服务器需要判断token的有效性,验证过程是先解密Token,对比加密字符串以及时间戳,如果加密字符串一致且时间未过期,那么这个token就是有效的。

    这种方法要比之前检查referer或者origin更安全一些,Token可以在产生并放于session之中,然后在每次请求时把token从session中拿出,与请求的token进行对比,但这种方法的比较麻烦的在于如何把Token以参数的形式加入请求。

    这个token的值必须是随机生成的,这样它就不会被攻击者猜到。在初始生成此token之后,该值将存储在会话中,并用于每个后续请求,直到会话过期。当最终用户发出请求时,服务端必须验证请求中的Token的存在性和有效性,与会话中找到的token相比较,如果在请求中找不到token,或者提供的值与会话中的值不匹配,则应中止请求,应重置token并将事件记录为正在进行的潜在csrf攻击。

    分布式校验

    在大型网站中,使用session存储csrf token会带来很大的压力,访问单台服务器session时同一个。但是现在的大型网站中,我们的服务器通常不止一台,可能是几十台甚至几百台,甚至多个机房都可能在不同的省份,由于session默认存储在单机服务器内存中,因此在分布式环境下同一个用户发送的多次Http请求可能会先后落在不同的服务器上,导致后面发起的http请求无法拿到之前存储在服务器session中的数据,从而使得session机制在分布式环境下失效,因此在分布式集群中csrf token需要存储在redis之类的公共存储空间。

    由于使用session存储,读取和验证csrf token会引起比较大的复杂度和性能问题。目前很多网站采用encrypted Token Pattern方式。这种方法的token是一个计算出来的结果,而非随机生成的字符串。这样在校验时无需再去读取存储的token,只用再次计算一次即可。

    这种Token的值通常是使用UserID、时间戳和随机数,通过加密的方式生成,这样既可以保证分布式服务的Token一致,又能保证Token不容易被破解。

    在token解密成功之后,服务器可以访问解析值,Token中包含UserID和时间戳将会被拿来验证有效性,将UserID与当前登陆的UserId进行比较,并将时间戳与当前时间比较。

    总结

    Token是一个比较有效的CSRF防护方法,只要页面没有XSS漏洞泄露Token,那么接口的CSRF就无法成功。

    但是此方法的实现比较复杂,需要给每一个页面写入token,每一个form和ajax请求都携带这个toen,后端对每个接口都进行校验,并保证token和请求token一致,

    这就使得这个防护策略不能在通用的拦截上统一处理,而需要每个页面和接口都添加对应的输出和校验,这种方法工作量巨大,且可能会有遗漏。

    验证码和密码其实也可以起到CSRF Token的作用,而且更安全。
    为什么很多银行等网站要求已经登陆的用户在转账时再次输入密码,是不是有一定道理了?

    双重cookie验证

    在绘会话存储csrf token比较繁琐,而且不能在通用的拦截上统一处理所有的接口。
    那么另一种防御措施是使用双重提交cookie,利用csrf攻击不能获取用户cookie的特点,我们可以要求Ajax和表单请求携带一个cookie的值

    双重cookie采用以下流程

    • 在用户访问网站页面时,向请求域名注入一个cookie,内容为随机字符串(例如:csrfcookie=xxx
    • 在前端向后端发起请求时,取出cookie,并添加到URL的参数中(例如:https://xxx.com/comment?csrfcookie=xxx
    • 后端接口验证cookie中的字段与URL参数中的字段是否一致,不一致则拒绝

    此方法相对于CSRF Token就简单了许多,可以直接通过前后端拦截的方法自动化实现。后端校验也更加方便,只需进行请求中字段的对比,不需要查询和存储token。

    当然,此方法没有大规模使用,因为其安全性没有csrf token高

    由于任何跨域都会导致前端无法获取cookie中的字段(包括子域名之间)于是发生如下情况:

    • 如果用户访问的网站为www.a.com,而后端api域名为api.a.com。那么在www.a.com下,前端拿不到api.a.com的cookie,也就无法完成双重cookie认证。
    • 于是认证这个cookie必须被种在a.com下,这样每个子域都可以访问
    • 任何一个子域都可以修改a.com下的cookie
    • 某个子域名存在漏洞被XSS攻击(例如upload.a.com)虽然这个子域下并没有什么值得窃取的信息,但攻击者修改了a.com下的cookie
    • 攻击者可以使用自己配置的cookie,对xss中招的用户再向www.a.com下,发起csrf攻击

    总结

    用双重cookie防御CSRF的优点

    • 无需使用session,适用面广,易于实施
    • Token存储在客户端中,不会给服务器带来压力
    • 相对于Token,实施成本更低,可以在前后端统一拦截校验,而不需要一个个接口和页面添加。

    缺点

    • cookie增加了额外字段
    • 如果有其他漏洞(例如XSS),攻击者可以注入cookie,那么该防御方式失效
    • 难以做到子域名的隔离
    • 为了确保cookie传输安全,采用这种防御方式最好采用https,不然也会有风险

    防止网站被利用

    CSRF攻击可能来自

    • 攻击者自己的网站
    展开全文
  • 如何防止CSRF攻击?

    2022-03-17 09:42:24
    二、CSRF的几种类型1、GET类型的CSRF2、POST类型的CSRF3、链接类型的CSRF三、CSRF的特点四、防护策略1、同源检测如何阻止外域请求无法确认来源域名情况2、CSRF Token原理1)将CSRF Token输出到页面中2)页面提交的...
  • bwapp上CSRF攻击代码

    2019-04-18 22:08:05
    bwapp平台上的CSRF攻击演示代码。
  • XSS攻击与CSRF攻击

    千次阅读 2022-04-08 16:39:45
    XSS攻击 什么是XSS Cross-Site Scripting(跨站脚本攻击),简称XSS,是一种代码注入攻击攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie、...
  • CSRF攻击与防御

    2022-02-11 11:24:34
    文章目录简介CSRF攻击原理CSRF例子与分析简单级别CSRF攻击中级别CSRF攻击高级别CSRF攻击CSRF防御方法1、简介> 2、CSRF攻击原理> 3、CSRF例子与分析4、CSRF防御方法 简介 CSRF攻击原理 CSRF例子与分析 简单级别...
  • CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患,比如 SQL 脚本注入,跨站域脚本攻击等在近年来已经逐渐为众人熟知,很多...
  • 什么是 CSRF 攻击

    万次阅读 多人点赞 2021-03-28 17:09:42
    简单来讲,CSRF 攻击就是黑客利用了用户的登录状态,并通过第三方的站点来做一些坏事 通常当用户打开了黑客的页面后,黑客有三种方式去实施 CSRF 攻击。 下面我们以极客时间官网为例子,来分析这三种攻击方式都是...
  • CSRF攻击原理与解决方法

    千次阅读 2022-02-17 17:40:10
    因为现代浏览器的工作机制原因,造成一种WEB攻击形态的存在, 这种攻击形式叫做CSRF攻击,以往我们是从攻击角度分析这种攻击的原理和操作。这次我们给出攻击原理同时,给出CSRF在服务器端的防御的解决方案。CSRF是...
  • 1. 通过代码示例来 演示CSRF攻击!2. 通过security给我们提供的保护机制,来进行防止CSRF攻击 3. security防止CSRF的原理
  • csrf攻击与防护—1用flask简单演示csrf攻击 以下是根据referer字段防止csrf攻击的新代码: bank.py from flask import render_template, Flask, request, jsonify, make_response app = Flask("haha") YOUR_BANK_...
  • 前端安全之CSRF攻击

    2021-07-03 22:16:13
    CSRF(Cross-site Request Forgery),跨站请求伪造攻击,简单来说就是攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送请求,并利用受害者在被攻击网站中获取的用户凭证,达到冒充受害者的目的,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,064
精华内容 16,025
关键字:

csrf攻击