问题一:什么是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. KnocoutJs+Mvc+BootStrap 学习笔记(Mvc)

    Mvc   1.Html 增加扩展方法 using System.Web.Mvc; namespace KnockoutBootstrapMvc.Entensions { public static ...

  2. pp 总结一

    1.JQ $.get() <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  3. mysql 5.6.25编译安装详细步骤

    简略步骤: mysql5.6.25编译安装步骤: 下载mysql准备用户和组yum安装依赖解压mysqlcmake编译mysqlmake && make install ----时间约 ...

  4. ORM框架之------Dapper,Net下无敌的ORM

    一,介绍:Dapper是一款轻量级ORM工具.如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用牛刀.你又觉得ORM省时省力,这 ...

  5. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-4项目前端说明

    本文目录1. 摘要2. UI界面展示 3. 主要技术点4. 总结 1.  摘要 平时比较忙,写一篇文章可能跨度好几天,希望各位多多包涵.闲言少叙直接进入正题. 2.  UI界面 NCMVC用的就图二, ...

  6. android测试--常用控件测试及测试经验(常见)

    1.图片选择器 ================测试中遇到的问题记录(除表中记录的)================================================== ①.曾出现,断 ...

  7. java的conllections.sort排序

    https://www.cnblogs.com/yw0219/p/7222108.html?utm_source=itdadao&utm_medium=referral

  8. Redis闪退解决办法

    复杂办法! cmd 进入命令,cd进入redis文件 输入:redis-server.exe redis.windows.conf,手动开启! 简单办法,删除重新下载! 不确定办法如下 1.在解压的r ...

  9. 2018年中国研究生数学建模竞赛C题 二等奖 赛题论文

    2018年中国研究生数学建模竞赛C题 对恐怖袭击事件记录数据的量化分析 恐怖袭击是指极端分子或组织人为制造的.针对但不仅限于平民及民用设施的.不符合国际道义的攻击行为,它不仅具有极大的杀伤性与破坏力, ...

  10. python mysql中文乱码

    问题: MySQLdb存入数据库后,在命令行查询 "select * from ip;",其中的中文都是乱码的. 但是通过python 执行 "select * from ...