简单理解 CSRF

什么是 CSRF?

CSRF,通常称为跨站请求伪造,英文名 Cross-site request forgery 缩写 CSRF,是一种对网站的恶意攻击。一个跨站请求伪造攻击迫使登录用户的浏览器将伪造的HTTP请求,包括该用户的会话 cookie 和其他认证信息,发送到一个存在漏洞的web应用程序。这就允许了攻击者迫使用户浏览器向存在漏洞的应用程序发送请求,而这些请求会被应用程序认为是用户的合法请求。与XSS相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

CSRF 攻击过程简述



访问受信任的站点 C,C 在您的浏览器中写入 Cookie , 您又访问含有攻击代码的站点 B, 站点 B 以您的身份向 A 发送了一个请求,而这个请求并没有经过您的同意或者并不是您想要发送的。

CSRF 的危害有哪些?

CSRF 可以用访问者的身份做很多事情,包括但不限于个人信息泄露、也可能会危害财产安全。

CSRF 常见攻击方式

常见的攻击方式大致可以分为以下几种

  1. Img 标签 GET 请求

例如修改当前已登录用户密码

    <img src="//rasp.oneasp.com/account/modifyPassword?new=123"/>
  1. Flash 或隐藏表单的主动提交

     <form action="//rasp.oneasp.com/account/modifyPassword">
    <input type="hidden" name="new" value="123"/>
    </form>
    <script>document.forms[0].submit()</script>
CSRF 如何防御

目前防护 CSRF 大多在服务器端进行验证和限制,客户端解决方案较少,实现成本也较高。服务端主要方式有以下几种

  1. Token 验证

这种方式可以过滤 95% 以上的 CSRF ,在表单提交时放入一个 token, 服务器验证该 token 是否有效。只允许有效的 token 请求, 否则拒绝当前操作。 但这种方式也有一定的局限性, 对于一些 GET 请求(例如获取当前用户信息的 GET 请求)加入 token 验证可能需要更改后端 API。

  1. Referer 验证

一般对于一些私有 API 完全可以拒绝非当前 origin 的 referer,在已知受信站点白名单的情况下,对于例如多站点共用的 API (例如权限系统)可以设置可访问 origin 的列表。需要注意在很多请求头中并没有 referer 或者 referer 不正确。

  1. 隐藏令牌

    将独有的令牌包含在一个隐藏字段中。 这将使得该令牌通过 HTTP 请求体发送,避免其包含在 URL 中从而被暴露出来。该独有令牌同样可以包含在 URL 中或作为一个 URL 参数。 但是这种方法的巨大风险在于:URL 会暴露给攻击者, 这样秘密令牌也会被泄漏。

CSRF 防护 in Flask

flask-wtf

在 Flask 0.9.0版本后,可以使用 Flask-WTF 来防御 CSRF 攻击,Flask-WTF 默认对所有提交的表单启用 csrf 防护

wtf的token
<form method="post" action="https://www.oneasp.com">
{{ form.csrf_token }}
</form>
非wtf的tokan

当使用非WTF表单的时候,可以将token放在一个隐藏域中,随表单一起提交

<form method="post" action="https://www.oneasp.com">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
</form>
AJAX的token

Ajax的token可以放在隐藏域或其他标签中, 在通过js获取token, 随Ajax请求提交

<script type="text/javascript">
var csrftoken = "{{ csrf_token() }}"
// 或者
var csrftoken = $('meta[name=csrf-token]').attr('content') $.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken)
}
}
})
</script>
自定义 CSRF 验证失败后的逻辑

Flask提供装饰器@csrf.error_handler 来支持定制当CSRF验证失败后的返回信息

@csrf.error_handler
def csrf_error(reason):
return render_template('csrf_error.html', reason=reason), 400

本文系 OneASP 前端工程师陈喜顺原创文章。如今,多样化的攻击手段层出不穷,传统安全解决方案越来越难以应对网络安全攻击。OneASP 自适应安全平台集成了预测、预防、检测和响应的能力,为您提供精准、持续、可视化的安全防护。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

最牛「CSRF防护」,带你进入大虾们的圈子!的更多相关文章

  1. 面试都在问的「微服务」「RPC」「服务治理」「下一代微服务」一文带你彻底搞懂!

    ❝ 文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) ❞ 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程 ...

  2. 微服务架构之「 API网关 」

    在微服务架构的系列文章中,前面已经通过文章<架构设计之「服务注册 」>介绍过了服务注册的原理和应用,今天这篇文章我们来聊一聊「 API网关 」. 「 API网关 」是任何微服务架构的重要组 ...

  3. 「AHOI / HNOI2017」单旋

    「AHOI / HNOI2017」单旋 题目链接 H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能多,效率高,掌握这种 ...

  4. 微信小程序开发平台新功能「云开发」快速上手体验

    微信小程序开发平台刚刚开放了一个全新的功能:云开发. 简单地说就是将开发人员搭建微信小程序后端的成本再次降低,此文刚好在此产品公测时,来快速上手看看都有哪些方便开发者的功能更新. 微信小程序一直保持一 ...

  5. CDH 6.0.1 集群搭建 「Before install」

    从这一篇文章开始会有三篇文章依次介绍集群搭建 「Before install」 「Process」 「After install」 继上一篇使用 docker 部署单机 CDH 的文章,当我们使用 d ...

  6. Linux 小知识翻译 - 「环境变量」

    这次,谈谈关于「环境变量」的话题. 所谓变量,就是在程序中设置的,相当于在内存中准备的「一个用来存放数据的小箱子」. 即,程序通过变量来保存值,通过变量保存的内容来进行各式各样的计算处理. 「环境变量 ...

  7. 下雨天,适合学「Spring Boot」

      北方的闷热,让不少小伙伴盼着下雨,前几天北京下了场大雨,杭州也紧跟这下了场雨,就在昨天原本还很闷热的天,突然就飘泼大雨了.今天也断断续续的下着小雨,一觉醒来已经是10点了.有句话说:懒惰是人的天性 ...

  8. 「Android 开发」入门笔记

    「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...

  9. Foxmail邮箱最新应用指南 --如何使用「邮件标签」?

    Foxmail邮箱最新应用指南--如何使用「邮件标签」? 最近看到很多的朋友收发电子邮件,现在我们帮助讲解下foxmail的标签功能,可以帮助我们整理我们的邮箱,让重要信息浮出水面. 1.鼠标右键邮件 ...

随机推荐

  1. 理解FTP协议

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5186117. ...

  2. WisDom.Net 框架设计(八) 持久层

    WisDom.Net ---持久层  1.什么是持久层        持久层负责最基础的功能支撑,为项目提供一个高层,统一,和并发的数据持久机制,提供了比如建立数据库连接,关闭数据库连接,执行sql语 ...

  3. fiddler接口测试

    浏览器中,可直接进行get接口测试:调用post方法的接口测试可用fiddler测试(当然,fiddler也支持get),如下图 [Execute]后双击左侧请求记录记录即可查看响应结果

  4. ubuntu15.10升级时校验和不符的解决方法

    博客: 安卓之家 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 博客园: 追风917 # 错误 # 原因分析 进入/var/lib/apt/lists/partial看下吧: 看到了吧 ...

  5. MyBatis的学习总结五:调用存储过程【参考】

    一.创建存储过程 存储过程的目的:统计edi_test_task 正在运行的任务和非运行的任务 CREATE DEFINER=`root`@`%` PROCEDURE `edihelper`.`SP_ ...

  6. Java file文件的写入和读取及下载

    File文件的写入 一.FileWriter 和BufferedWriter 结合写入文件 FileWriter是字符流写入字符到文件.默认情况下,它会使用新的内容代替文件原有的所有内容,但是,当指定 ...

  7. jQuery easyUI框架中经常出现的问题

    相信开发者对于我们jquery来说都不会陌生吧,jquery为我们的开发提供了很多各式各样的库,满足各种开发的需求,其中我们知道的有轻量级的,但是也有一些基于富客服端的一些重量级库,顾名思义,当我们在 ...

  8. Python:列表

    #!/usr/bin/python3 #列表 是可变的,可修改的 listDemo = ["one","two","three"," ...

  9. Lucene索引的初步创建

    从百度上知道的,Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的 ...

  10. C++资源之不完全导引 (转载)

    C++资源之不完全导引(完整版)- - 这文章太强了,我一定要转载,否则对不起观众,对不起自己.(liigo) 发信人: NULLNULL (空空), 信区: VC标  题: C++资源之不完全导引( ...