csrf跨站请求伪造
创始人
2024-01-21 14:50:57

文章目录

    • csrf跨站请求伪造
      • 1、前戏
      • 2、csrf校验
        • 2.1、from表单如何符合校验
        • 2.2、ajax如何符合校验
      • 3、csrf相关装饰器
        • FBV
        • CBV

csrf跨站请求伪造

1、前戏

"""
钓鱼网站搭建一个跟正规网站一摸一样的界面(中国银行)用户进入到我们的网站,用户给某人打钱,用户打钱操作确确实实是提交给了中国银行的系统,用户的钱也确确实实减少了,但是唯一不同是打钱的账户不是用户想要打的账户,变成了另一个账户内部本质:在钓鱼网站的页面,针对对方账户,只给用户提供一个没有name属性的input框,然后我们再内部隐藏一个已经写好name和value的input框,"""

真正的网站端口:8000

http://127.0.0.1:8000

# 注释掉csrf'django.middleware.csrf.CsrfViewMiddleware',

中国银行

username:

target_user:

money:

# views.py
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')# urls.py
path('transfer/',views.transfer)

钓鱼网站模拟端口:8001

#不用注释csfr

phishing site

username:

target_user:

money:

#views.py
def transfer(request):return render(request,'transfer.html')# urls.py
path('transfer/',views.transfer)

2、csrf校验

如何规避上述问题:
csrf跨站请求伪造
网站再给用户返回一个提交数据功能的页面的时候会给这个页面加一个唯一标识
当这个页面朝后端发post请求的时候,后端会先校验唯一标识,如果唯一标识不对,直接拒绝(403 forbiden),如果成功则正常执行

2.1、from表单如何符合校验

#开启配置文件里的csrf中间件
{% csrf_token %}

username:

target_user:

money:

在这里插入图片描述

再次发送请求

在这里插入图片描述

钓鱼网站再次发送请求

在这里插入图片描述

2.2、ajax如何符合校验

不论是ajax还是谁,只要是向我Django提交post请求的数据,都必须校验csrf_token来防伪跨站请求

  • 方式一

通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送



中国银行

{% csrf_token %}

username:

target_user:

money:

  • 方式二


中国银行

{% csrf_token %}

username:

target_user:

money:

  • 方式三

先拷贝js文件:

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');function csrfSafeMethod(method) {// these HTTP methods do not require CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}$.ajaxSetup({beforeSend: function (xhr, settings) {if (!csrfSafeMethod(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}}
});

将文件配置到静态文件中,在html页面上通过导入该文件即可自动帮我们解决ajax提交post数据时校验csrf_token的问题

在这里插入图片描述



中国银行

{% csrf_token %}

username:

target_user:

money:

{% load static %}

3、csrf相关装饰器

FBV

  • 网站整体都校验csrf,就单单几个视图函数不校验
#配置文件中开始csrf中间件,
from django.views.decorators.csrf import csrf_protect, csrf_exempt"""
csrf_protect,需要校验
csrf_exempt  忽视校验
"""@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')
  • 网站整体都不校验csrf,就单单几个视图函数需要校验
# 注释掉form表单中 {% csrf_token %}#}
#关闭配置文件中csrf中间件@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')

在这里插入图片描述

CBV

csrf_protect,需要校验
​	针对csrf_protect符合CBV装饰器的三种写法csrf_exempt  忽视校验
​	针对csrf_protect只能给dispatch方法加才有效
  • 网站整体都不校验csrf,就单单几个视图函数需要校验
# views.py
from django.utils.decorators import method_decorator
from django.views import View# @method_decorator(csrf_protect,name='post') #第二种
class MycsrfToken(View):@method_decorator(csrf_protect)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) #第一种方式可以def post(self, request):return HttpResponse('post')# urls.pypath('csrf/', views.MycsrfToken.as_view()),
# html  from表单向csrf路由提交

中国银行

{# {% csrf_token %}#}

username:

target_user:

money:

# urls.py path('transfer/', views.transfer),# views.py 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')
  • 网站整体都校验csrf,就单单几个视图函数不校验
from django.utils.decorators import method_decorator
from django.views import View# @method_decorator(csrf_exempt,name='dispatch') 
class MycsrfToken(View):@method_decorator(csrf_exempt)def dispatch(self, request, *args, **kwargs):return super(MycsrfToken, self).dispatch(request, *args, **kwargs)def get(self, request):return HttpResponse('get')def post(self, request):return HttpResponse('post')

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
1和0什么意思网络用语 0和1... 最近,有网友给大家出了份考卷,卷面是几位“00后”的QQ对 话:dbq、xswl、nss、nbcs、...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
七大洲八大洋 七大洲简易图三角... 一、北美洲(中北美和加勒比海)北美洲面积约2471万平方公里,居世界第三。人口约5.79亿(2016...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...