热门标签 | 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')

推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
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社区 版权所有