CSRF是什么?

  (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

CSRF可以做什么?

  你这可以这么理解 CSRF 攻击:攻击者盗用了你的身份,伪装成你发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

它这么厉害,那它的原理是什么?

CSRF原理简述

  用户访问一个网站就会将用户的相关信息保存cookies中(session可以认为加了密的cookies,然后保存到的cookies中),这时用户又访问了一个很危险的网站,这个网站就会利用你之前访问网站留下的cookies发送一些恶意请求

CSRF预防的方式

  我总结了两种预防CSRF攻击的方式:后台直接处理CSRF攻击(个人说法)和前端ajax请求方式

  后台处理CSRF攻击

    很简单,只需要在表单中增加一个name属性值为csrf_token、value属性值为{{ csrf_token() }} 的隐藏的input表单标签。

  1. <form class="form-signin" method="post">
  2. <h2 class="form-signin-heading">请登录</h2>
  3.  
  4. <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
  5.  
  6. <label for="inputEmail" class="sr-only">邮箱:</label>
  7. <input type="email" id="inputEmail" class="form-control" name="email" placeholder="请输入邮箱地址" required autofocus>
  8. <label for="inputPassword" class="sr-only">密码:</label>
  9. <input type="password" id="inputPassword" class="form-control" name="password" placeholder="请输入密码" required>
  10. <div class="checkbox">
  11. <label>
  12. <input type="checkbox" name="remember" value="1"> 记住我
  13. </label>
  14. </div>
  15. <button class="btn btn-lg btn-primary btn-block" type="submit">立即登录</button>
  16. </form>

    后台的csrftoken需要绑定到app上,这样前端表单传入的参数不会受到CSRF攻击就可以像平常一样获取post参数即可(上篇python web框架Flask后台登录,就是使用这种方式处理CSRF攻击的)

  1. def create_app():
  2. """
  3. 主入口文件创建app,供其他蓝图使用
  4. :return: 返回一个app
  5. """
  6. app = Flask(__name__)
  7. # 防止csrf注入攻击
  8. CSRFProtect(app)
  9. # 注册蓝图模块
  10. app.register_blueprint(cms_bp, url_prefix="/cms")
  11. app.register_blueprint(common_bp, url_prefix="/common")
  12. app.register_blueprint(front_bp)
  13.  
  14. # 导入配置文件
  15. app.config.from_object(config)
  16. # 数据库db初始化app
  17. db.init_app(app)
  18. # 后台登录login_manager初始化app
  19. cms_login_manager.init_app(app)
  20. return app
  21.  
  22. if __name__ == '__main__':
  23. app = create_app()
  24. app.run()

  前端ajax请求方式

    前端Ajax请求是实现页面刷新的一种非常好的方式,但是Ajax请求也会有CSRF攻击。防止CSRF攻击也很简单,只需要两步:

      1)在当前页面上添加一个name为csrf-token, content为{{csrf_token()}}的meta标签

  1. <meta name="csrf-token" content="{{ csrf_token() }}">

      2)重写Ajax请求,并返回一个含有csrftoken的请求头

  1. 'use strict';
  2. var cpajax = {
  3. "get": function(args){
  4. args["method"] = "get";
  5. this.ajax(args);
  6. },
  7. "post": function(args){
  8. args["method"] = "post";
  9. this.ajax(args);
  10. },
  11. "ajax": function(args){
  12. this._ajaxSetup();
  13. $.ajax(args);
  14. },
  15. "_ajaxSetup": function(args){
  16. $.ajaxSetup({
  17. "beforeSend": function(xhr, settings){
  18. if(!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain){
  19. var csrftoken = $("meta[name=csrf-token]").attr("content");
  20. xhr.setRequestHeader("X-CSRFToken", csrftoken);
  21. }
  22. }
  23. });
  24. }
  25. };

    3)这样前端就不能使用$.post()请求了(这种请求不能阻止CSRF攻击的),而是使用我们重写的Ajax请求。

  1. $(function(){
  2. $("#submit").on("click", function(event){
  3. event.preventDefault();
  4.  
  5. var oldpwdE = $("input[name=oldpwd]");
  6. var newpwdE = $("input[name=newpwd]");
  7. var newpwd2E = $("input[name=newpwd2]");
  8.  
  9. var oldpwd = oldpwdE.val();
  10. var newpwd = newpwdE.val();
  11. var newpwd2 = newpwd2E.val();
  12.  
  13. //1、要在模板中的meta标签中渲染一个csrf-token
  14. //2、在ajax请求的头部设置x-CSRFtoken
  15. console.log("aaaaaaa");
  16. cpajax.post({
  17. "url": "/cms/resetpwd",
  18. "data": {
  19. "oldpwd": oldpwd,
  20. "newpwd": newpwd,
  21. "newpwd2": newpwd2
  22. },
  23. "success": function(data){
  24. console.log(data)
  25. },
  26. "fail": function(error){
  27. console.log(error)
  28. }
  29. })
  30. })
  31. });

  

python web框架Flask——csrf攻击的更多相关文章

  1. python web框架Flask——后台登录

    项目搭建 创建一个项目之后,需要在手动创建几个包(含有__init__.py文件的目录)和文件 1.在主目录下创建配置文件:config.py 2.在主目录下创建扩展文件:exts.py 3.在主目录 ...

  2. Python Web框架——Flask

    简介 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理 ...

  3. Python web框架 flask

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  4. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  5. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

  6. 用Python手把手教你搭建一个web框架-flask微框架!

    在之前的文章当中,小编已经教过大家怎么搭建一个Django框架,今天我们来探索另外的一种框架的搭建,这个框架就是web框架-flask微框架啦!首先我们带着以下的几个问题来阅读本文: 1.flask是 ...

  7. 浅谈Python Web 框架:Django, Twisted, Tornado, Flask, Cyclone 和 Pyramid

    Django Django 是一个高级的 Python Web 框架,支持快速开发,简洁.实用的设计.如果你正在建一个和电子商务网站相似的应用,那你应该选择用 Django 框架.它能使你快速完成工作 ...

  8. python web框架介绍对比

    Django Python框架虽然说是百花齐放,但仍然有那么一家是最大的,它就是Django.要说Django是Python框架里最好的,有人同意也有人 坚决反对,但说Django的文档最完善.市场占 ...

  9. python web框架——扩展Django&tornado

    一 Django自定义分页 目的:自定义分页功能,并把它写成模块(注意其中涉及到的python基础知识) models.py文件 # Create your models here. class Us ...

随机推荐

  1. C#发送邮件(内容中有图片)

    用微软的System.Net.Mail发送邮件,有些时候发邮件需要邮件内容中添加图片. 对象解释 SmtpClient类:允许应用程序使用简单邮件传输协议 (SMTP) 发送电子邮件.MailAddr ...

  2. C#深入浅出之更多数据类型

    类型的划分        一个类型,要么是值类型,要么是引用类型.区别在于拷贝方式:值类型拷贝值,引用类型拷贝引用 值类型        值类型直接包含值.相当于每一个值类型都有自己单独的值: int ...

  3. Flask 教程 第五章:用户登录

    本文翻译自The Flask Mega-Tutorial Part V: User Logins 这是Flask Mega-Tutorial系列的第五部分,我将告诉你如何创建一个用户登录子系统. 你在 ...

  4. JS基础语法---作用域链

    从函数嵌套来分析: (层数一般5层内) var num=10; function f1() { var num=20; function f2() { var num=30; function f3( ...

  5. 自动化运维工具-Ansible基础

    目录 自动化运维工具-Ansible基础 什么是Ansible 同类型软件对比 Ansible的功能及优点 Ansible的架构 Ansible的执行流程 安装Ansible ansible配置文件 ...

  6. 转载一篇:Django静态文件

    静态文件: 项目中的CSS.图片.js都是静态文件.一般会将静态文件放到一 个单独的目录中,以方便管理.在html页面中调用时,也需要指 定静态文件的路径,Django中提供了一种解析的方式配置静态文 ...

  7. RPM命令总结

    RPM软件管理程序 rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他 ...

  8. Fiddler 过滤掉无用域名

    - 在 Fiters 一栏勾选Show only Internet Hosts 及Show only the following Hosts- 然后在下面输入需要保留的域名

  9. 201871010118-唐敬博《面向对象程序设计(java)》第一周学习总结

    博文正文开头格式:(3分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/p/11435127.html 这个作业的要求在哪里 https:/ ...

  10. C语言快速入门一:win10系统环境搭建

    0.搭建环境:WIN10 64位 1.下载minGW.zip编译器 2.解决上述文件,配置环境变量 3.配置变成后验证:打开cmd命令行,输入gcc -v 提示以下内容,说明编译器安装成功 D:\mm ...