博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flask基础(17)-->防止 CSRF 攻击
阅读量:5106 次
发布时间:2019-06-13

本文共 3198 字,大约阅读时间需要 10 分钟。

CSRF

  • CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造。
  • CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求。
    • 包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......
  • 造成的问题:个人隐私泄露以及财产安全。

CSRF攻击示意图

  • 客户端访问服务器时没有同服务器做安全验证

防止 CSRF 攻击

步骤

  1. 在客户端向后端请求界面数据的时候,后端会往响应中的 cookie 中设置 csrf_token 的值
  2. 在 Form 表单中添加一个隐藏的的字段,值也是 csrf_token
  3. 在用户点击提交的时候,会带上这两个值向后台发起请求
  4. 后端接受到请求,以会以下几件事件:
    • 从 cookie中取出 csrf_token
    • 从 表单数据中取出来隐藏的 csrf_token 的值
    • 进行对比
  5. 如果比较之后两值一样,那么代表是正常的请求,如果没取到或者比较不一样,代表不是正常的请求,不执行下一步操作

那么下面我们用一个代码案例进行演示一下:防止CSRF攻击的代码示例(如果想测试没有CSRF预防的情况,可以在代码里直接更改即可:即去掉转账视图crsf_token验证功能即可)

CRSF_test.py(视图页面)

from flask import Flask, render_template, make_responsefrom flask import redirectfrom flask import requestfrom flask import url_forimport os,base64app = Flask(__name__)# 生成 csrf_token 函数def generate_csrf():    return bytes.decode(base64.b64encode(os.urandom(48)))@app.route('/login', methods=["POST", "GET"])def login():    if request.method == "POST":        # 取到表单中提交上来的参数        username = request.form.get("username")        password = request.form.get("password")        if not all([username, password]):            print('用户名或密码错误')        else:            print(username, password)            if username == 'laowang' and password == '1234':                # 状态保持,设置用户名到cookie中表示登录成功                response = redirect(url_for('transfer'))                response.set_cookie('username', username)                return response            else:                print('密码错误')    return render_template('login_test.html')@app.route('/transfer', methods=["POST", "GET"])def transfer():    # 从cookie中取到用户名    username = request.cookies.get('username', None)    # 如果没有取到,代表没有登录    if not username:        return redirect(url_for('login'))    if request.method == "POST":        to_account = request.form.get("to_account")        money = request.form.get("money")        # 取出表单中的 csrf_token        form_csrf_token = request.form.get("csrf_token")        # 取出 cookie 中的 csrf_token        cookie_csrf_token = request.cookies.get("csrf_token")        # 进行对比        if cookie_csrf_token != form_csrf_token:            return 'token校验失败,非法操作'        print('假装执行转操作,将当前登录用户的钱转账到指定账户')        return '转账 %s 元到 %s 成功' % (money, to_account)    # 渲染转换页面        # 生成 csrf_token 的值    csrf_token = generate_csrf()    # 渲染转换页面,传入 csrf_token 到模板中    response = make_response(render_template('transfer_test.html', csrf_token=csrf_token))    # 设置csrf_token到cookie中,用于提交校验    response.set_cookie('csrf_token', csrf_token)    return responseif __name__ == '__main__':    app.run(debug=True, port=9000)

login.test.py(登录模板页面)

    
登录

我是网站A,登录页面

 

transfer_test.py(转账模板页面)

    
转账

我是网站A,转账页面

 

下面是进行CSRF攻击的恶意网站(俗称钓鱼网站):hack_test.py(视图页)

from flask import Flaskfrom flask import render_templateapp = Flask(__name__)@app.route('/hongbao')def index():    return render_template('hack_test.html')if __name__ == '__main__':    app.run(debug=True, port=8000)

 

hack_test.py(模板页)

    
Title

我是网站B

 

以上代码亲测有效,如有问题或者建议,欢迎在下面留言☺☺☺

 

 

转载于:https://www.cnblogs.com/888888CN/p/9489345.html

你可能感兴趣的文章
性能测试工具 java ur_jmeter之自定义java请求性能测试
查看>>
java 成员域_java – Eclipse为域对象和带有’m’后缀的类成员生成getter/setter
查看>>
java jute_ZooKeeper源码阅读(六):JUTE
查看>>
java 创建书类_1、创建实体类(Customer.java、Orders.java)复制代码 代码如下:package wck.stu.vo.oneToMany_single...
查看>>
java短信验证怎么实现6,如何实现java手机短信验证功能
查看>>
php 5.2 xdebug,用PHP 5.5安装xdebug
查看>>
php多克,在PHP中使用Heredoc有什么好处?
查看>>
安卓setText导入什么Java包,java – 如何在recyclerview上添加SetOnClicklistener
查看>>
php 整数转日期,php数字转时间的方法
查看>>
mle matlab,MLE的Matlab程序
查看>>
php 视频资源互动共享系统,PHP教与学资源网站设计
查看>>
php buffer 切割,PHP 输出buffer控制 | 学步园
查看>>
php 名称搜索排序,php – 按名称弹性搜索排序
查看>>
java pdf动态生成,从Java应用程序动态生成PDF文件
查看>>
红细胞识别matlab,图像处理—红细胞计数(Matlab).doc
查看>>
php让from背景变成半透明,php – imagecreatefrompng()使一个黑色的背景,而不是透明?...
查看>>
oracle函数基础知识,ORACLE 基础知识以及基本函数
查看>>
oracle9i安装后,Oracle9i安装过程说明
查看>>
oracle+609,Fatal NI Connect 12560' And 'ORA-609 解决方法
查看>>
oracle会话比进程高,oracle数据库CPU特别高的解决方法详解
查看>>