热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:跨站请求伪造(csrf)

跨站请求伪造(csrf)钓鱼网站?就类似于你搭建了一个跟银行一模一样的web页面?用户在你的网站转账的时候输

跨站请求伪造(csrf) 钓鱼网站

? 就类似于你搭建了一个跟银行一模一样的web页面

? 用户在你的网站转账的时候输入用户名 密码 对方账户

? 银行里面的钱确实少了 但是发现收款人变了

最简单的原理

  1. 你写的form表单中 用户的用户名 密码都会真实的提交给银行后台

  2. 但是收款人的账户却不是用户填的 你暴露给用户的是一个没有name属性的input框

  3. 你自己提前写好了一个隐藏的带有name和value的input框


真正的网站

前端

真正的网站



username:


target_username:


money:



后端

def transfer(request):#转账
if request.method=="POST":
username = request.POST.get('username')
target_username = request.POST.get('target_username')
mOney= request.POST.get('money')
print('%s给%s转了%s钱'%(username,target_username,money))
return render(request,'formm.html')

钓鱼网站

前端

钓鱼的网站



username:


解决钓鱼网站的策略

  1. 只要是用户想要提交post请求的页面 我在返回给用户的时候就提前设置好一个随机字符串

  2. 当用户提交post请求的时候 我会自动先取查找是否有该随机字符串

  3. 如果有 正常提交

  4. 如果没有 直接报403


form表单方法1

{% csrf_token %} 给出一个随机字符串,用来进行校验

真正的网站



{% csrf_token %}

username:


target_username:


money:



技术图片

ajax方法1

第一种 自己再页面上先通过{% csrf_token %}获取到随机字符串 然后利用标签查找

data{‘username‘:‘jason‘,‘csrfmiddlewaretoken‘:$(‘[name="csrfmiddlewaretoken"]‘).val()},

真正的网站



{% csrf_token %}

username:


target_username:


money:





ajax方法2

第二种data:{‘username‘:‘jason‘,‘csrfmiddlewaretoken‘:‘{{ csrf_token }}‘},

真正的网站



{% csrf_token %}

username:


target_username:


money:





ajax方法3

前端,导入下面的js

真正的网站



{% csrf_token %}

username:


target_username:


money:





第三种

拷贝下面js文件,新建文件夹static,然后静态文件配置,然后导入前端文件

js文件

function getCOOKIE(name) {
var COOKIEValue = null;
if (document.COOKIE && document.COOKIE !== '') {
var COOKIEs = document.COOKIE.split(';');
for (var i = 0; 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 protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});

将上面的django的静态文件中,在html页面上通过导入该文件即可自动帮我们解决ajax提交post数据时校验csrf_token的问题,(导入该配置文件之前,需要先导入jQuery,因为这个配置文件内的内容是基于jQuery来实现的)

更多细节详见:Djagno官方文档中关于CSRF的内容

校验指定的请求

csrf_exempt 只有两种装饰的方式

from django.views.decorators.csrf import csrf_exempt, csrf_protect
#csrf_exempt 不校验
# csrf_protect 校验

第一种

from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
@csrf_exempt
def exem(request):
return HttpResponse('exempt')
@csrf_protect
def pro(request):
return HttpResponse('pro')

CBV装饰器

除了csrf_exempt之外 所有的其他装饰器 在CBV上面都有三种方式

方式1

命名@method_decorator(csrf_exempt,name=‘dispatch‘)

from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
from django.views import View
# 第一种
# @method_decorator(csrf_exempt,name='dispatch')
class MyCsrf(View):
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
def get(self,request):
return HttpResponse('hahaha')
@method_decorator(csrf_protect)
def post(self,request):
return HttpResponse('post')

方式2

@method_decorator(csrf_protect)


from django.views.decorators.csrf import csrf_exempt, csrf_protect
from django.utils.decorators import method_decorator
from django.views import View
class MyCsrf(View):
@method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request,*args,**kwargs)
def get(self,request):
return HttpResponse('hahaha')
@method_decorator(csrf_protect)
def post(self,request):
return HttpResponse('post')

推荐阅读
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 在Django中提交表单时遇到值错误问题如何解决?
    在Django项目中,当用户提交包含多个选择目标的表单时,可能会遇到值错误问题。本文将探讨如何通过优化表单处理逻辑和验证机制来有效解决这一问题,确保表单数据的准确性和完整性。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文将介绍如何在混合开发(Hybrid)应用中实现Native与HTML5的交互,包括基本概念、学习目标以及具体的实现步骤。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
author-avatar
手机用户2502925763
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有