CSRF攻击原理

网站是通过cookie来实现登录功能的。而cookie只要存在浏览器中,那么浏览器在访问这个cookie的服务器的时候,就会自动的携带cookie信息到服务器上去。那么这时候就存在一个漏洞了。如果你访问了一个恶意网站,这个网站可以在网页源码中插入JS代码,使用JS代码给其他服务器发送请求。因为在发送请求的时候,浏览器会自动把cookie发送给对应的服务器,这时候相应的服务器就不知道这个请求是伪造的。从而达到在用户不知情的情况下,给某个服务器发送了一个请求。

防御CSRF攻击原理

CSRF攻击的要点就是在向服务器发送请求的时候,相应的cookie会自动的发送给对应的服务器。造成服务器不知道这个请求是用户发起的还是伪造的。这时候,我们可以在用户每次访问有表单页面的时候,在网页源码中加一个随机的字符串叫做csrf_token,在cookie中也加入一个相同值的csrf_token字符串。以后给服务器发送请求的时候,必须在body中以及cookie中都携带 csrf_token,服务器只有检测到cookie中的csrf_token和body中的csrf_token都相同,才认为这个请求是正常的。否则就是伪造的,那么黑客就没办法伪造请求了。

Flask防御CSRF攻击

使用flask_wtf.CSRFProtect来包裹app

import os
from flask_wtf import CSRFProtect
app.config['SECRET_KEY'] = os.urandom(24) #和session一样,必须要配置一个secret key参与加密
CSRFProtect(app)

然后在模板form表单中添加一个input标签,加载csrf_token

<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>

以上配置就能够在,用户在提交表单后一并把表单中的csrf_token提交到服务器,并和服务器上的csrf_token做对比,这样就能够识别请求是否是伪造的,从而避免CSRF攻击

AJAX处理CSRF漏洞

如果我们的表单是通过AJAX提交处理的。示例如下

<head>...<!--我们这里的AJAX代码是用JQuery写的,因此要引入Jquery--><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><!--AJAX代码在login.js文件中--><script src="{{ url_for('static', filename='login.js') }}"></script>
</head><body><form action="" method="post"><table><tr><td>邮箱:</td><td><input name="email" type="text" /></td></tr><tr><td>密码:</td><td><input name="password" type="text" /></td></tr><tr><td></td><td><input type="submit" value="提交"  id="submit"/></td></tr></table></form>
</body>

login.html

login.js

...class LoginView(views.MethodView):def get(self):return render_template('login.html')def post(self):email = request.form.get('email')password = request.form.get('password')if email == 'heboan@qq.com' and password == '123456':return '登录成功'else:return '登录失败'app.add_url_rule('/login/', view_func=LoginView.as_view('login'))

login视图

以上我们已经成功使用了AJAX处理表单。现在我们启用CSRF,主程序中代码如下:

import os
from flask_wtf import CSRFProtect
app.config['SECRET_KEY'] = os.urandom(24) #和session一样,必须要配置一个secret key参与加密
CSRFProtect(app)

然后我们再次用正确的账号密码登录,发现出现错误,因为我们启用防csrf攻击,但是AJAX那里并没有携带csrf_token,所以请求失败

因此,我们需要在login.html中添加一个表单用来存放token

<form action="" method="post"><!--添加一个隐藏input用来放置csrf_token--><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><table><tr><td>邮箱:</td><td><input name="email" type="text" /></td></tr><tr><td>密码:</td><td><input name="password" type="text" /></td></tr><tr><td></td><td><input type="submit" value="提交"  id="submit"/></td></tr></table>
</form>

编辑AJAX代码段,把表单中的csrf_token传给服务器作比对

再次登录(强制刷新浏览器,因为js有缓存)

AJAX处理CSRF漏洞--优化代码

csrf_token可以放置的head中。在实际项目中,我们一般也是放在头部,这样做有个好处就是:当多处需要用到csrf_token,我们就不需要多次写一个隐藏的csrf_token表单。特别是在模板继承的时候,我们只要在父模板中的head中加入csrf配置,其子模板就可以直接继承了。

编辑login.html

<head><!--在head中加上此配置--><meta name="csrf-token" content="{{ csrf_token() }}">...
</head><!--表单中就不需要添加一个csrf_token表单了-->
<form action="" method="post"><table><tr><td>邮箱:</td><td><input name="email" type="text" /></td></tr><tr><td>密码:</td><td><input name="password" type="text" /></td></tr><tr><td></td><td><input type="submit" value="提交"  id="submit"/></td></tr></table>
</form>

新建一个heboan_ajax.js, 来封装

修改login.js

最后在login.html中要引入封装的js

<head>...<meta name="csrf_token" content="{{ csrf_token() }}"><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script><script src="{{ url_for('static', filename='heboan_ajax.js') }}"></script><script src="{{ url_for('static', filename='login.js') }}"></script></head>

这样实现的好处就是以后在其他地方处理CSRF的时候,我们直接把我们封装好的heboan_ajax拿来用就可以了,模板那边可以通过继承实现避免重复定义csrf_token表单和js引入

转载于:https://www.cnblogs.com/sellsa/p/9369019.html

19、Flask实战第19天:CSRF攻击与防御相关推荐

  1. ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御

    ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3  ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP ...

  2. csrf 攻击和防御

    CSRF概念:CSRF跨站点请求伪造(Cross-Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:        攻击者盗用了你的身份,以你的名义发送 ...

  3. php csrf攻击 xss区别,XSS与CSRF攻击及防御方法

    前言 web安全这词可能对于服务端工程师来说更加"眼熟",部分前端工程师并不是十分了解,今天就来讲讲XSS攻击与CSRF攻击及防御方法 XSS XSS (Cross Site Sc ...

  4. csrf 攻击及防御

    1.什么是CSRF攻击: CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:C ...

  5. CSRF——攻击与防御

    CSRF--攻击与防御 author: lake2 0x01 什么是CSRF攻击 CSRF是Cross Site Request Forgery的缩写(也缩写为XSRF),直译过来就是跨站请求伪造的意 ...

  6. 深入理解CSRF攻击与防御

    深入理解CSRF攻击与防御 What is CSRF CSRF攻击原理 CSRF攻击的大致步骤: How to defense CSRF 验证 HTTP Referer 字段 在请求地址中添加 tok ...

  7. CSRF攻击与防御(写得非常好)

           CSRF概念:CSRF跨站点请求伪造(Cross-Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:        攻击者盗用了你的身份, ...

  8. Web安全CSRF攻击与防御

    来自:区块链技术联盟 https://www.toutiao.com/a6514792395601609223/ 参考: http://blog.csdn.net/stpeace/article/de ...

  9. csrf防御 java_一分钟了解【CSRF攻击与防御】

    含义 跨站请求伪造(英语:Cross-Site Request Forgery),简称CSRF.是指网站在用户不知情的情况下,引导用户请求外部URL. 实例 用户首先登录B网站,然后打开A网站(恶意网 ...

  10. WEB攻击之 CSRF 攻击及防御策略

    介绍 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法. 释义: 跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如 ...

最新文章

  1. Prometheus+Granfana
  2. vsftp 在pasv下的防火墙配置
  3. Fedora 15 16 17 18 20无线网卡驱动安装
  4. vs2010 调试快捷键
  5. IOS 自定义NIB视图
  6. MicroPython开发板播放音乐教程
  7. 显示数量_SOLIDWORKS 标注螺纹不显示数量?Why
  8. Struts2自定义标签(template)——示例
  9. Oracle用户密码使用特殊符号,例如(AND)、$(Dollar)、#(Pound)、*(Star)等
  10. Android 一个页面上下两个ListView的页面显示
  11. ClassNotFoundException和NoClassDefError之间的区别
  12. [JAVA]使用Jersey处理Http协议中的Multipart
  13. 微信网页开发那些破事儿
  14. 如何将运维的报警做成运营的报警--Java后端架构
  15. 30个外贸业务员常用邮件模板案例分享
  16. 显示器不亮电源灯闪_台式电脑显示屏不亮指示灯一直闪烁
  17. 项目管理和产品立项流程图
  18. mac os无法登录appstore的解决方法
  19. 测试电商项目 第三章
  20. python 更换windows壁纸(简单)

热门文章

  1. 【渝粤教育】国家开放大学2018年春季 8668-22T汽车涂装技术(A) 参考试题
  2. [渝粤教育] 中国地质大学 审计学 复习题
  3. CRF++ Source code reading experience
  4. 强化学习中值迭代收敛性推理证明
  5. Intellij IDEA 发布后的项目在哪里
  6. 关于VS2017提示I/O文件操作函数需要加上_s的解决办法
  7. 12简单推导:切面条
  8. Android判断App是否在前台运行
  9. [转]人像识别是个伪命题
  10. Python模块02/序列化/os模块/sys模块/haslib加密/collections