• 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 校验的 WebA

      • 后端代码实现
      
      from flask import Flask, render_template, make_response
      from flask import redirect
      from flask import request from flask import url_for app = Flask(__name__) @app.route('/', methods=["POST", "GET"]) def index(): 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('temp_login.html') @app.route('/transfer', methods=["POST", "GET"]) def transfer(): # 从cookie中取到用户名 username = request.cookies.get('username', None) # 如果没有取到,代表没有登录 if not username: return redirect(url_for('index')) if request.method == "POST": to_account = request.form.get("to_account") money = request.form.get("money") print('假装执行转操作,将当前登录用户的钱转账到指定账户') return '转账 %s 元到 %s 成功' % (money, to_account) # 渲染转换页面 response = make_response(render_template('temp_transfer.html')) return response if __name__ == '__main__': app.run(debug=True, port=9000) 
      • 前端登录页面代码
      <!DOCTYPE html>
      <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <h1>我是网站A,登录页面</h1> <form method="post"> <label>用户名:</label><input type="text" name="username" placeholder="请输入用户名"><br/> <label>密码:</label><input type="password" name="password" placeholder="请输入密码"><br/> <input type="submit" value="登录"> </form> </body> </html> 
      • 前端转账页面代码
      <!DOCTYPE html>
      <html lang="en"> <head> <meta charset="UTF-8"> <title>转账</title> </head> <body> <h1>我是网站A,转账页面</h1> <form method="post"> <label>账户:</label><input type="text" name="to_account" placeholder="请输入要转账的账户"><br/> <label>金额:</label><input type="number" name="money" placeholder="请输入转账金额"><br/> <input type="submit" value="转账"> </form> </body> </html> 

      运行测试,如果在未登录的情况下,不能直接进入转账页面,测试转账是成功的

      攻击网站B的代码

      • 后端代码实现
      from flask import Flask
      from flask import render_templateapp = Flask(__name__)@app.route('/')
      def index():return render_template('temp_index.html')if __name__ == '__main__':app.run(debug=True, port=8000)
      
      • 前端代码实现
      <!DOCTYPE html>
      <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>我是网站B</h1> <form method="post" action="http://127.0.0.1:9000/transfer"> <input type="hidden" name="to_account" value="999999"> <input type="hidden" name="money" value="190000" hidden> <input type="submit" value="点击领取优惠券"> </form> </body> </html> 

      运行测试,在用户登录网站A的情况下,点击网站B的按钮,可以实现伪造访问

    在网站A中模拟实现 csrf_token 校验的流程

    • 添加生成 csrf_token 的函数
    # 生成 csrf_token 函数
    def generate_csrf(): return bytes.decode(base64.b64encode(os.urandom(48))) 
    • 在渲染转账页面的,做以下几件事情:

      • 生成 csrf_token 的值
      • 在返回转账页面的响应里面设置 csrf_token 到 cookie 中
      • 将 csrf_token 保存到表单的隐藏字段中
    @app.route('/transfer', methods=["POST", "GET"])
    def transfer(): ... # 生成 csrf_token 的值 csrf_token = generate_csrf() # 渲染转换页面,传入 csrf_token 到模板中 response = make_response(render_template('temp_transfer.html', csrf_token=csrf_token)) # 设置csrf_token到cookie中,用于提交校验 response.set_cookie('csrf_token', csrf_token) return response 
    • 在转账模板表单中添加 csrf_token 隐藏字段
    <form method="post"><input type="hidden" name="csrf_token" value="{{ csrf_token }}"> <label>账户:</label><input type="text" name="to_account" placeholder="请输入要转账的账户"><br/> <label>金额:</label><input type="number" name="money" placeholder="请输入转账金额"><br/> <input type="submit" value="转账"> </form> 
    • 运行测试,进入到转账页面之后,查看 cookie 和 html 源代码

转载于:https://www.cnblogs.com/skaarl/p/9335414.html

SCRF的简介及防护手段相关推荐

  1. 攻击防护手段_如何防护ddos流量攻击?

    量攻击分很多种: 我们常见的DDOS CC SYN UDP等,目前在网络中,流量攻击比较难解决,普通的IDC机房或是服务器商都是依靠硬防来解决,但是碰到大流量攻击,往往是拔线了事,所以都不是什么好办法 ...

  2. 什么是DDOS流量攻击,DDoS防护手段

    什么是DDOS流量攻击?全称Distributed Denial of Service,中文意思为"分布式拒绝服务",主要是利用大量合法的分布式服务器对目标发送请求,从而导致正常合 ...

  3. 面对流量型DDOS攻击不知所措?这几种DDOS防护手段你需要知道

    我们知道DDOS攻击是通过各种手段消耗网络带宽和系统CPU.内存.连接数等资源,直接造成网络带宽耗尽或系统资源耗尽,使得该目标系统无法为正常用户提供业务服务,从而导致拒绝服务.常规流量型的DDOS防护 ...

  4. slow http attack 简介及防护办法

    简介 slow http attack也叫HTTP慢速攻击,是一种ddos攻击的变体版本.通常来说,它通过向服务器发送正常的http请求,只不过请求的头或者请求体的内容特别长,发送速度有特别慢,这样每 ...

  5. 服务器的主要防护手段有哪些

    一.服务器的硬防 硬防即硬件防火墙,是指把防火墙程序做到芯片里面,由硬件执行这些功能,能减少CPU的负担,使路由更稳定.它是保障内部网络安全的一道重要屏障.它的安全和稳定,直接关系到整个内部网络的安全 ...

  6. 勒索变种有不变的特征吗?有相应的防护手段吗?

    一.勒索变种肆虐全球 随着勒索软件即服务"RaaS"的出现,勒索产业化逐渐成熟,专业化的分工也让大量黑客投入到勒索病毒的制作研发中,包括LockBit.BlueSky.Deno.R ...

  7. NSA绝密黑客小组TAO负责人揭秘防护手段

    这位NSA针对性入侵行动领导者极其罕见地由幕后走向台前 你敢扫上图的二维码吗? 美国国家安全局(简称NSA)向来以行踪诡秘而著称,但此次其精英针对性入侵行动(简称TAO)黑客团队领导者直接走上Usen ...

  8. linux 符号链接攻击防御简介

    前言 IBM下有两款大型关系型数据库,分别是Informix和DB2.早在2001年和2003年两款数据库就被爆出存在符号链攻击提权的问题.尤其2003年Snosoft一口气发布了DB2数个关键工具存 ...

  9. OWASPTop10安全风险与防护

    原理: 在开发web应用程序时,开发人员每每只关注Web应用程序所需的功能,因此经常会创建自定义的认证和会话方案.可是要正确的实现这些方案倒本章目的 普及OWASP TOP 10包含的内容.每种Web ...

最新文章

  1. mysql5.7复制集_mysql--replication复制集典型配置
  2. 规模-复杂世界的简单法则---熵
  3. php java if_phpjava(二)
  4. 解决Android Studio编译后安装apk报错:Error while Installing APK
  5. 北斗导航 | 完全自主研发国产高端三维激光雷达助力中国测绘技术发展
  6. rust军用船指令_Rust基础学习笔记(五):Cargo与Crates.io
  7. 【重点】LeetCode 146. LRU Cache
  8. 【图像增强】基于matlab HSV空间双边滤波图像去雾【含Matlab源码 067期】
  9. Linux系统的上行和下行带宽的检测
  10. 单独开一贴个人认为是编译器缺陷希望有人提交给微软
  11. pq分区后丢失部分磁盘
  12. ionic4--下拉刷新(refresher)
  13. 区块链 - 牵一发而动全身的链式结构
  14. 苹果净利润同比下滑19%,大中华区下滑30%;养老基金将入股市投资,首批可能达2000亿元
  15. 滤波算法 | 无迹卡尔曼滤波(UKF)算法及其Python实现
  16. Android知识回顾-- 消息处理机制
  17. 像李云迪那样爱 IT界那些“情”
  18. #网站图标、地址栏图标、收藏夹图标、favicon.ico
  19. IE11升级(不联网模式)之P处理
  20. MySQL Group Replication [Single-Primary Mode] 详细搭建部署过程

热门文章

  1. Python爬虫_Requests
  2. 关于table的那些用法(一)
  3. less-postcss
  4. 详细讲解C++ 类的继承
  5. OpenCV3学习(11.4)斑点检测 SimpleBlobDetector
  6. OpenCV3学习(4.1)——图像阈值操作(Threshold,AdaptiveThreshold)
  7. mysql5.6 pid_MySQL5.6启动报错The server quit without updating PID file
  8. 计算机网络校园网络设计方案,毕业论文--《计算机网络》校园网设计方案
  9. 力扣232-用栈实现队列(C++,附思路)
  10. idea 使用 maven 整合 ssm 框架 实现简单的增、删、改 和 分页查询功能