开发者社区> 问答> 正文

如何预防CSRF?

展开
收起
前端问答 2019-12-15 14:38:15 1183 0
1 条回答
写回答
取消 提交回答
  • 前端问答小助手

    CSRF通常从第三⽅⽹站发起,被攻击的⽹站⽆法防⽌攻击发⽣,只能通过增强⾃⼰⽹站针对CSRF的防护能⼒来提升安全性。

    CSRF的两个特点:

    • CSRF(通常)发⽣在第三⽅域名。
    • CSRF攻击者不能获取到Cookie等信息,只是使⽤。

    针对这两点,我们可以专⻔制定防护策略,如下:

    • 阻⽌不明外域的访问
      • 同源检测
      • Samesite Cookie
    • 提交时要求附加本域才能获取的信息
      • CSRF Token
      • 双重Cookie验证

    因此我们可以针对性得进⾏预防

    同源检测

    既然CSRF⼤多来⾃第三⽅⽹站,那么我们就直接禁⽌外域(或者不受信任的域名)对我们发起请求:

    • 使⽤Origin Header确定来源域名: 在部分与CSRF有关的请求中,请求的Header中会携带Origin字段,如果Origin存在,那么直接使⽤Origin中的字段确认来源域名就可以
    • 使⽤Referer Header确定来源域名: 根据HTTP协议,在HTTP头中有⼀个字段叫Referer,记录了该HTTP请求的来源地址

    CSRF Token

    CSRF的另⼀个特征是,攻击者⽆法直接窃取到⽤户的信息(Cookie,Header,⽹站内容等),仅仅是冒⽤Cookie中的信息。

    ⽽CSRF攻击之所以能够成功,是因为服务器误把攻击者发送的请求当成了⽤户⾃⼰的请求。那么我们可以要求所有的 ⽤户请求都携带⼀个CSRF攻击者⽆法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求 和攻击的请求区分开,也可以防范CSRF的攻击:

    CSRF Token的防护策略分为三个步骤:

    • 将CSRF Token输出到⻚⾯中
    • ⻚⾯提交的请求携带这个Token
    • 服务器验证Token是否正确

    双重Cookie验证

    在会话中存储CSRF Token⽐较繁琐,⽽且不能在通⽤的拦截上统⼀处理所有的接⼝

    那么另⼀种防御措施是使⽤双重提交Cookie。利⽤CSRF攻击不能获取到⽤户Cookie的特点,我们可以要求Ajax和表单请求携带⼀个Cookie中的值

    双重Cookie采⽤以下流程:

    • 在⽤户访问⽹站⻚⾯时,向请求域名注⼊⼀个Cookie,内容为随机字符串(例如 csrfcookie=v8g9e4ksfhw )。
    • 在前端向后端发起请求时,取出Cookie,并添加到URL的参数中(接上例 POST https://www.a.com/comment?csrfcookie=v8g9e4ksfhw )。
    • 后端接⼝验证Cookie中的字段与URL参数中的字段是否⼀致,不⼀致则拒绝。
    2019-12-16 10:17:26
    赞同 1 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载