什么是CSRF跨站请求伪造?(from表单效验csrf-ajdax效验csrf-Ajax设置csrf-CBV装饰器验证csrf)
一:csrf跨站请求伪造
1.什么是CSRF?
CSRF跨站请求伪造。也被称为One Click Attack和Session Riding,通常缩写为CSRF或XSRF。如果从名字你还不知道它表示什么,你可以这样理解:攻击者(黑客,钓鱼网站)盗用了你的身份,以你的名义发送恶意请求,这些请求包括发送邮件,发送消息,盗取账号,购买商品,银行转账,从而使你的个人隐私泄露和财产损失。
2.CSRF攻击案例(钓鱼网站)
1.我搭建一个跟正规网站一模一样的界面(中国银行)
2.用户不小心进入到了我们的网站,用户给某个人打钱
3.打钱的操作确确实实是提交给了中国银行的系统,用户的钱也确确实实减少了
4.但是唯一不同的是打钱的账户不是用户想要打的账户变成了一个莫名其妙的账户

3.钓鱼网站 内部原理
1.我们在钓鱼网站的页面,针对对方账户,只给用户提供一个没有name属性的普通input框
2.然后我们在内部隐藏一个已经写好name和value和input框

- 内部代码
正规银行
# transfer.html
<h1>我是正儿八经的网站</h1>
<form action="" method="post">
<p>username: <input type="text" name="username"></p>
<p>target_user: <input type="text" name="target_user"></p>
<p>money: <input type="text" name="money"></p>
<input type="submit">
</form>
# views
def transfer(request):
if request.method == 'POST'
username = request.POST.:get('username')
target_user = request.POST.get('target_user')
money = request.POST.get('money')
print('%s给%s转了%s元' % (username, target_user, money))
return render(request, 'transfer.html')
不正规钓鱼网站
# transfer.html
<h1>我是钓鱼网站</h1>
<form action="http://127.0.0.1:8000/transfer/" method="post">
<p>username: <input type="text" name="username"></p>
<p>target_user: <input type="text"></p>
{# 隐藏 #}
<input type="text" name="target_user" value="jason" style="display: none">
<p>money: <input type="text" name="money"></p>
<input type="submit">
</form>
def transfer(request):
return render(request, 'transfer.html')
4.CSRF原理(钓鱼网站内部本质)

5.从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成以下两个步骤:
- 登陆受信任网站A,并在本地生成Cookie
- 在不登出A的情况下,访问危险网站B。
看到这里,你也许会问:“如果我不满足以上两个条件中的一个,我就不会受到CSRF攻击”。是滴,确实如此,但是你不能保证以下情况不会发生:
- 你不能保证你登陆了一个网站之后,不再打开一个tab页面并访问其他的网站(黄色网站)
- 你不能保证你关闭浏览器之后,你本地的Cookie立刻过期,你上传的会话已经结束
- 上述中所谓的攻击网站,可能就是一个钓鱼网站或者黄色网站
6.CSRF如何防御规避上述问题
# csrf跨站请求伪造效验
1.网站在给用户返回一个具有提交数据功能页面的时候会给这个页面加一个唯一标识。
2.当这个页面朝后端发送post请求的时候,我的后端会先效验唯一标识,如果唯一标识不对直接拒绝(403 forbbiden),如果成功则正常执行。
二:如何符合校验
1.form表单如何符合校验
# 1.打开settings内中间件打开
<form action="" method="post">
{% csrf_token %} // 给正规的网站页面都添加一个唯一标识
<p>username:<input type="text" name="username"></p>
<p>target_user:<input type="text" name="target_user"></p>
<p>money:<input type="text" name="money"></p>
<input type="submit">
</form>

三ajax如何符合校验
1.第一种 利用标签查找获取页面上的随机字符串
// name对应的值 拿到标签对应的值
data:{"username":'jason','csrfmiddlewaretoken':$('[name=csrfmiddlewaretoken]').val()},
2.第二种 利用模版语法提供的快捷书写
data:{"username":'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},
3.第三种 通用方式(直接拷贝js代码并应用到自己的html页面上即可)
- 不需要写模板语法,只需要引入一个静态文件内js文件即可
data:{"username":'jason'},
4.配置静态文件settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
transfer.html
<button id="d1">ajax请求</button>
{# 动态解析 静态文件#}
{% load static %}
<script src="{% static 'js/mysetup.js' %}"></script>
<script>
$('#d1').click(function () {
$.ajax({
url:'', // 不写默认提交地址当前
type:'post', // 请求
// 第一种
{#data:{"username":"jason", 'csrfmiddlewaretoken':$('[name=csrfmiddlewretoken]').val()},#}
// 第二种
{#data:{"username":'jason', 'csrfmiddlewaretoken':'{{ csrf_token }}'},#}
data:{"username":'jason'}, // 数据
success:function () {
}
})
})
</script>

四:Ajax请求设置csrf_token
不论是ajax还是谁,只要是向我Django提交post请求的数据,都必须校验csrf_token来防伪跨站请求
将下面的文件配置到你的Django项目的静态文件中,在html页面上通过导入该文件即可自动帮我们解决ajax提交post数据时校验csrf_token的问题,(导入该配置文件之前,需要先导入jQuery,因为这个配置文件内的内容是基于jQuery来实现的)
更多细节详见:Djagno官方文档中关于CSRF的内容
getCookie方法:
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
使用$.ajaxSetup()方法为ajax请求统一设置
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
五:csrf相关装饰器
1.需求:
1.网站整体都不校验csrf/配置文件中间件注释掉,就单单几个视图函数需要校验
2.网站整体都校验csrf/配置文件中间件不注释,就单单几个视图函数不校验
2.Django内部自带装饰器
from django.views.decorators.csrf import csrf_protect,csrf_exempt
csrf_protect 需要校验
针对csrf_protect符合我们之前所学的装饰器的三种玩法
csrf_exempt 忽视校验
针对csrf_exempt只能给dispatch方法加才有效
3.开始进行验证Django自带装饰器
1.注释掉给前端页面form表单添加的唯一标识{% csrf_token %}
4.整个网站都不校验csfr,就该单单一个视图需要校验
- 注释掉sessings中间件第四个
# @csrf_protect
def transfer(request):
if request.method == 'POST':
username = request.POST.get('username')
target_user = request.POST.get('target_user')
money = request.POST.get('money')
print('%s给%s转了%s元'%(username,target_user,money))
return render(request,'transfer.html')


###### 5.整个网站都效验csfr,就单单一个视图函数不校验
* settings设置第四个中间件打开
```python
# @csrf_exempt
def transfer(request):
if request.method == 'POST':
username = request.POST.get('username')
target_user = request.POST.get('target_user')
money = request.POST.get('money')
print('%s给%s转了%s元'%(username,target_user,money))
return render(request,'transfer.html')

六:CBV装饰器
1.验证csrf_protect时 注释掉settings配置中间件第四个 (post与get都不需要效验)
2.验证csrf_exempt时 打开settings配置中间件第四个 (post与get都需要效验)
from django.utils.decorators import method_decorator
from django.views import View
# @method_decorator(csrf_protect,name='post') # 针对csrf_protect 第二种方式全局,指名道姓,可以
# @method_decorator(csrf_exempt,name='post') # 针对csrf_exempt 第二种方式不可以
@method_decorator(csrf_exempt,name='dispatch')
class MyCsrfToken(View):
# @method_decorator(csrf_protect) # 针对csrf_protect 第三种方式可以
# @method_decorator(csrf_exempt) # 针对csrf_exempt 第三种方式可以
def dispatch(self, request, *args, **kwargs):
return super(MyCsrfToken, self).dispatch(request,*args,**kwargs)
def get(self,request):
return HttpResponse('get')
# @method_decorator(csrf_protect) # 针对csrf_protect 第一种方式可以
# @method_decorator(csrf_exempt) # 针对csrf_exempt 第一种方式不可以
def post(self,request):
return HttpResponse('post')
3.总结CBV装饰器
1.针对csrf_exempt只能加在dispatch才能生效
2.以下两种是等价的
# 1.指名道姓给dispatch加csrf_exempt
@method_decorator(csrf_exempt,name='dispatch')
# 2.直接给dispatch加csrf_exempt装饰器
@method_decorator(csrf_exempt) # 针对csrf_exempt 第三种方式可以
def dispatch(self, request, *args, **kwargs):
return super(MyCsrfToken, self).dispatch(request,*args,**kwargs)
什么是CSRF跨站请求伪造?(from表单效验csrf-ajdax效验csrf-Ajax设置csrf-CBV装饰器验证csrf)的更多相关文章
- web前端安全 XSS跨站脚本 CSRF跨站请求伪造 SQL注入
web安全,从前端做起,总结下web前端安全的几种技术: 1,XSS XSS的全称是Cross Site Scripting,意思是跨站脚本,XSS的原理也就是往HTML中注入脚本,HTML指定了脚本 ...
- python CSRF跨站请求伪造
python CSRF跨站请求伪造 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- Django之CSRF跨站请求伪造(老掉牙的钓鱼网站模拟)
首先这是一个测试的代码 请先在setting页面进行下面操作 注释完成后,开始模拟钓鱼网站的跨站请求伪造操作: 前端代码: <!DOCTYPE html> <html lang=&q ...
- ajax向Django前后端提交请求和CSRF跨站请求伪造
1.ajax登录示例 urls.py from django.conf.urls import url from django.contrib import admin from app01 impo ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- Django中的CSRF(跨站请求伪造)
Django中的CSRF(跨站请求伪造) Django CSRF 什么是CSFR 即跨站请求伪装,就是通常所说的钓鱼网站. 钓鱼网站的页面和正经网站的页面对浏览器来说有什么区别? (页面是怎么来的? ...
- Django框架 之 基于Ajax中csrf跨站请求伪造
Django框架 之 基于Ajax中csrf跨站请求伪造 ajax中csrf跨站请求伪造 方式一 1 2 3 $.ajaxSetup({ data: {csrfmiddlewaretoken: ...
- 十三 Django框架,CSRF跨站请求伪造
全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...
- Web框架之Django_09 重要组件(Django中间件、csrf跨站请求伪造)
摘要 Django中间件 csrf跨站请求伪造 一.Django中间件: 什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于 ...
随机推荐
- 乐动ld06激光雷达sdk改bug记录分享
前言: 工作中,有使用过乐动ld06款激光雷达,此款雷达将常规雷达的转动的电机部分内置于自己的保护罩内,减少了雷达本身转动积灰等其他外界影响,探测半径是12m,是一款不错的雷达. 不过今天的主要内容不 ...
- Java中Arrays数组工具类的使用全解
本文几乎涵盖了所有的Arrays工具类(基于Java 11)的方法以及使用用例,一站式带你了解Arrays类的用法,希望对大家有帮助. 码字不易,三连支持一下吧 Arrays数组工具类 方法一览表 快 ...
- Appium链接夜神模拟器
参考官方技术文档: http://appium.io/slate/cn/master/ 确保已经安装jdk和adt adb需要配置系统环境变量: D:\adt-bundle-windows-x86_6 ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件
文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...
- 带你掌握Java各种日志框架
一:日志基本概念及框架 1:什么是日志 Java程序员在开发项目时都是依赖Eclipse/IDEA等集成开发工具的Debug调试功能来跟踪解决Bug,但项目打包部署发布到了测试环境和生产环境怎么办?难 ...
- (待补充)diff 算法解析
今天,学习React的时候,底层提到了 diff算法,顺藤摸瓜, 也发现了VUE也使用了diff算法. mark一下,后续补充 infoq-VUE-diff算法 react-diff算法
- WPF/MVVM Quick Start Tutorial - WPF/MVVM 快速入门教程 -原文,翻译及一点自己的补充
转载自 https://www.codeproject.com/articles/165368/wpf-mvvm-quick-start-tutorial WPF/MVVM Quick Start T ...
- [自动化]基于kolla-ansible部署的openstack自动化巡检生成xlsx报告
自动化巡检介绍 此巡检项目在kolla-ansible部署的openstack环境上开发,利用ansible-playbook编排的功能,对巡检的任务进行编排和数据处理.主要巡检的对象有IaaS平台和 ...
- 数据分析用这样的报表工具,秒杀Excel!
报表工具是为满足公司对报表数据的业务需求,弥补第三方报表平台给项目开发定制报表的工作而自主研发的一个通用性强易于维护的web报表工具. 报表工具以NPOI基础架构,通过公司的REAP开发框架运用到所有 ...
- 超强可视化图表工具:Smartbi!!
要制作出专业的可视化图表,还是需要一定的学习成本的,并且需要大量的时间.并且即使是制作出来,配色也是一大难题,对于一般人而言,通常会通过两种方式实现可视化大屏的制作: 1.写代码 大部分人可能会选择大 ...