问题一:什么是csrf?

英文全称Cross Site Request Forgery(跨站请求伪造);

通俗来讲就是攻击者盗用你的身份,冒用你的名义发出恶意请求,包括发送邮件,电话信息,甚至于转账或者是购买虚拟货币;

csrf攻击的示意图()

CSRF攻击的原理:

1,用户向服务器端发送请求登录信息,服务器端会在用户的浏览器上设置A站点的cookie值;

2,用户在未清除cookie的情况下,在B站点中点击向隐藏的向A站点发送请求的标签,在用户不知情的情况下向A站点发送请求;

3;若A站点在未进行csrftoken验证的情况下,B站点伪造过来的请求就会通过服务器的验证,从而进行下一步的操作。

防止CSRF攻击的方法:

1,前端页面发送请求数据的时候,后端会想cookies上设置一串随机字符串(csrf_token值);

2,在form表单中将设置一个隐藏的字段,值与在cookies中设置的相同(csrf_token值);

3,在用户点击提交的时候,客户端会同时将两个值发送到后端程序;

4,后端接收到客户端的请求之后,会做出一下几个动作

  1,从cookies中将csrf_token值取出来;

  2,将forn表单中的csrf_token值出来;

  3,将两个随机字符串做对比;

5,相同就就表明是用户自己发送过来的请求,不相同就表示是伪造的的用户请求。

代码实例

 import base64
import os
from _curses import flash 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 == '':
# 状态保持,设置用户名到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")
# 取到表单中的token
form_csrf_token = request.form.get('csrf_token')
# cookie中的token
cookie_csrf_token = request.cookies.get('csrf_token', "") # 做校验。如果校验成功,再进行转账逻辑
if form_csrf_token != cookie_csrf_token:
return "非法请求" print('假装执行转账操作,将当前登录用户的钱转账到指定账户')
return '转账 %s 元到 %s 成功' % (money, to_account) csrf_token = generate_csrf()
# 渲染转换页面
response = make_response(render_template('temp_transfer.html', csrf_token=csrf_token))
# 往cookie中添加csrf_token
response.set_cookie('csrf_token', csrf_token)
return response # 生成 csrf_token
def generate_csrf():
return bytes.decode(base64.b64encode(os.urandom(48))) if __name__ == '__main__':
app.run(debug=True, port=9000)

站点A的逻辑代码示例

 <!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>

站点A的登录界面模拟

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>转账</title>
</head>
<body>
<h1>我是网站A,转账页面</h1> <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> </body>
</html>

站点A的转账模拟

站点B的逻辑代码

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

站点B的逻辑代码模拟

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <h1 style="background: red">我是网站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">
<input type="submit" value="点击领取优惠券">
</form> </body>
</html>

站点B的模拟请求伪造的代码

备注:B中隐藏的标签会在用户不知道的情况下携带A中的cookie值向A站点发送转账的请求;

flask内容学习第三天(flak中的csrf跨站请求)的更多相关文章

  1. Django中的CSRF(跨站请求伪造)

    Django中的CSRF(跨站请求伪造) Django CSRF  什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...

  2. Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想

    django中间件 中间件介绍 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出. ...

  3. 第三百一十五节,Django框架,CSRF跨站请求伪造

    第三百一十五节,Django框架,CSRF跨站请求伪造  全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...

  4. Django框架 之 基于Ajax中csrf跨站请求伪造

    Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({     data: {csrfmiddlewaretoken: ...

  5. XSS跨站脚本攻击与CSRF跨站请求伪造攻击的学习总结(转载)

    转载自 https://blog.csdn.net/baidu_24024601/article/details/51957270 之前就了解过这方面的知识,但是没有系统地总结.今天在这总结一下,也让 ...

  6. 安全性测试入门 (三):CSRF 跨站请求伪造攻击和防御

    本篇继续对于安全性测试话题,结合DVWA进行研习. CSRF(Cross-site request forgery):跨站请求伪造 1. 跨站请求伪造攻击 CSRF则通过伪装成受信任用户的请求来利用受 ...

  7. 1205 CSRF跨站请求与django中的auth模块使用

    目录 今日内容 昨日回顾 基于配置文件的编程思想 importlib模块 简单代码实现 跨站请求伪造csrf 1. 钓鱼网站 如何实现 模拟该现象的产生 2. 解决问题 解决 {% csrf_toke ...

  8. CSRF(跨站请求伪造)学习总结

    前言 参考大佬的文章,附上地址 https://www.freebuf.com/articles/web/118352.html 什么是CSRF? CSRF,中文名字,跨站请求伪造,听起来是不是和XS ...

  9. CSRF 跨站请求伪造学习笔记

    参考文章: 漏洞挖掘之CSRF CSRF花式绕过Referer技巧 What-是什么 CSRF(Cross-site request forgery)跨站请求伪造.攻击者通过构造特殊链接或者页面,盗用 ...

随机推荐

  1. 实现虚拟机VMware上Centos操作系统与主机windows之间互相复制与粘贴

    1.启动你的虚拟机,然后点击虚拟机,如下所示(未安装的话,显示的是安装VMware Tools): 2.点击安装Vmware tools以后显示如下所示: 3.VMwareTools-9.9.2-24 ...

  2. CentOS挂Windows的NFS备忘

    Windows NFS 安装和配置  注:需要将名称为“所有计算机”的访问类型改为“无访问权限”,再将可访问IP的访问类型改为“读写”,并勾选“允许根目录访问” ,如WINDOWS有防火墙开放“204 ...

  3. c++ char数组形式的字符串 与输入输出

    1. c风格字符串,和strlen函数 #include "stdafx.h" #include <iostream> using std::cout; using s ...

  4. [转] 合理使用npm version与npm dist-tag详解

    第一步:发布第一个稳定版本 npm publish//1.0.0 第二步:修改文件继续发布第二个版本 git add -A && git commit -m "c" ...

  5. IDEA上创建 Maven SpringBoot项目发布到Tomcat

    概述 上篇记录了IDEA上创建Maven SpringBoot+mybatisplus+thymeleaf 项目,但是如何将SpringBoot发布到Tomcat,直接采用Maven 命令Clear- ...

  6. .NET Core在安装(VS2015)与部署

    .NET Core开发环境搭建 使用VS2015开发.NET Core项目,环境的搭建可以参考官网,大致安装步骤如下: 1.首先你得装个vs2015 并且保证已经升级至 update3及以上,下载链接 ...

  7. IOS内存约定-【ios】

    IOS中内存采用引用计数的方式,在释放内存编程时采用约定的方式,在这里不长篇大论具体内存的原理,只从实用角度出发记录下如何根据这些约定来释放内存. 具体约定为: 当你使用new.alloc.copy  ...

  8. 【转载】WIN7访问共享:0x80070035 找不到网络路径解决方法

    转载:http://blog.chinaunix.net/uid-12372814-id-3518571.html 昨天刚装WIN7系统,今天早上准备访问服务器安装些软件,结果出现网络错误,提示Win ...

  9. angularjs 中通过 $location 进行路由跳转传参

    $location.path('/page1').search({id: $scope.id,name:$scope.name}); 带参数跳转页面,在新的页面通过$routeParams接收参数 $ ...

  10. Bootstrap 框架、插件

    Bootstrap,前端工程师比较常用的框架.插件,根据它的定义,我们不妨这样理解,Bootstrap就是用于前端开发的一个模板,就是别人做好了我们直接可以搬过来直接使用或者根据自己需要略加修改设计自 ...