Django csrf校验的实现

引入:

通常,钓鱼网站本质是本质搭建一个跟正常网站一模一样的页面,用户在该页面上完成转账功能

转账的请求确实是朝着正常网站的服务端提交,唯一不同的在于收款账户人不同。

如果想模拟一个钓鱼网站,就可是给用户书写一个form表单 对方账户的input框没有name属性,然后你自己悄悄提前写好了一个具有默认的并且是隐藏的具有name属性的input框。

如果想解决这个问题,当转账请求发送给服务端后,服务端会给各台机器返回一个随机实时字符串。下一次,如果还有请求向服务端发时,服务端会校验字符串,若对不上的话服务端就拒绝访问。这就是csrf校验。

那么form表单如何进行csrf校验呢?

你只需要在你的form表单内写一个{% csrf_token %}就可以了

Ajax请求设置csrf_token的三种方式

示例:

urls.py

urlpatterns = [
    url(r'^transfer/', views.transfer),
]

settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]

第三种方式的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 protection
  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

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')

前端页面 transfer.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="external nofollow"  rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<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>
<button id="d1">发送ajax请求</button>

{% load static %}
<script src="{% static 'myfile.js' %}"></script>
<script>
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            // 第一种方式 自己手动获取
            {#data:{'username':'jason','csrfmiddlewaretoken':$('input[name="csrfmiddlewaretoken"]').val()},#}
            // 第二种方式 利用模板语法
            {#data:{'username':'jason','csrfmiddlewaretoken':'{{ csrf_token }}'},#}
            // 第三种     通用方式 引入外部js文件
            data:{'username':'hank'},
            success:function (data) {
                alert(data)
            }
        })
    })
</script>
</body>
</html>

csrf装饰器

csrf装饰器作用在FBV上

装饰器模块导入:

from django.views.decorators.csrf import csrf_exempt,csrf_protect

当我们网站整体都校验csrf的时候 我想让某几个视图函数不校验

@csrf_exempt #给哪个视图函数加上,就不给哪个视图校验csrf

当我们网站整体都不校验csrf的时候 我想让某几个视图函数校验

@csrf_protect  #给哪个视图函数加上,就给哪个视图校验csrf

注意:验证同时需要把'django.middleware.csrf.CsrfViewMiddleware'注销掉

csrf装饰器作用在CBV上

当我们网站整体都不校验csrf的时候 我想让某几个视图函数校验

from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt,csrf_protect

# @method_decorator(csrf_protect,name='post')  #第二种指名道姓地给某给方法装
class MyHome(View):
    @method_decorator(csrf_protect)  #第三种 给类中所有的方法都装
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request,*args,**kwargs)

    def get(self,request):
        return HttpResponse('get')
    # @method_decorator(csrf_protect)   #第一种方式
    def post(self,request):
        return HttpResponse('post')

注意:验证同时需要把'django.middleware.csrf.CsrfViewMiddleware'注销掉

当我们网站整体都校验csrf的时候 我想让某几个视图函数不校验

总结:给CBV加装饰器 推荐使用模块method_decorator

csrf_exempt 只能给dispatch方法装

到此这篇关于Django csrf校验的实现的文章就介绍到这了,更多相关Django csrf校验内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • django免除csrf校验的方法

    免除csrf校验 在django中默认启动csrf校验,当用户发起post请求时,必须携带csrf_token参数.如果不想使用csrf校验时,可以使用以下方式免除校验.以下方式都是在局部中使用,如果想全局禁用时,需要在settings文件中配置,这种方式不推荐使用. 一.函数免除csrf校验 from django.views.decorators.csrf import csrf_exempt# 免除csrf校验@csrf_exempt def users(request): uses_li

  • Django csrf校验的实现

    引入: 通常,钓鱼网站本质是本质搭建一个跟正常网站一模一样的页面,用户在该页面上完成转账功能 转账的请求确实是朝着正常网站的服务端提交,唯一不同的在于收款账户人不同. 如果想模拟一个钓鱼网站,就可是给用户书写一个form表单 对方账户的input框没有name属性,然后你自己悄悄提前写好了一个具有默认的并且是隐藏的具有name属性的input框. 如果想解决这个问题,当转账请求发送给服务端后,服务端会给各台机器返回一个随机实时字符串.下一次,如果还有请求向服务端发时,服务端会校验字符串,若对不上

  • Django CSRF认证的几种解决方案

    什么是CSRF 浏览器在发送请求的时候,会自动带上当前域名对应的cookie内容,发送给服务端,不管这个请求是来源A网站还是其它网站,只要请求的是A网站的链接,就会带上A网站的cookie.浏览器的同源策略并不能阻止CSRF攻击,因为浏览器不会停止js发送请求到服务端,只是在必要的时候拦截了响应的内容.或者说浏览器收到响应之前它不知道该不该拒绝. 攻击过程 用户登陆A网站后,攻击者自己开发一个B网站,这个网站会通过js请求A网站,比如用户点击了某个按钮,就触发了js的执行. 防止攻击 Doubl

  • Django csrf 两种方法设置form的实例

    第一种方法,在视图函数上边添加一条语句 @csrf_exempt 例子: @csrf_exempt def login(request): return render_to_response('app/login.html', locals()) 上边的方法是取消csrf的防御机制. 第二种方法,给出例子,主要为在html的form里面加入{% csrf_token %}这句话,视图函数内加入render(request, 'app/breakdown_view.html', locals())

  • vue-resource post数据时碰到Django csrf问题的解决

    公司最近用vue写前端,用vue-resource遇到的一些问题,现在记录下来. vue-resource post数据 this.$http.post('/someUrl',data, [options]).then(function(response){ // 响应成功回调 }, function(response){ // 响应错误回调 }); vue-resource 向后端请求api, 公司的后台是用Django 开发的,Django为了防止跨站请求伪造,即csrf攻击,提供了Csrf

  • Django CSRF跨站请求伪造防护过程解析

    前言 CSRF全称Cross-site request forgery(跨站请求伪造),是一种网络的攻击方式,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或者XSRF. 攻击原理 1.用户访问正常的网站A,浏览器就会保存网站A的cookies. 2.用户在访问恶意网站B, 网站B上有某个隐藏的链接会自动请求网站A的链接地址,例如表单提交,传指定的参数. 3.恶意网站B的自动化请求,执行就是在用户A的同一个浏览器上,因此在访问网站A的时

  • Django csrf 验证问题的实现

    关于 csrf 的基本了解 百度百科:CSRF(Cross-site request forgery)跨站请求伪造,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用.通过伪装来自受信任用户的请求来利用受信任的网站. 简单来说就是攻击者盗用你的身份,以你的名义来发送恶意请求.比如说用户通过账号密码访问了网站A,A网站将一些cookie信息保存在浏览器中实现用户状态行为跟踪.这时用户又打开了B网站,B网站返回了一些恶意代码,并请求访问A.这样浏览器就会携带cookie以用户的权限访问A网站并执

  • Django跨域请求CSRF的方法示例

    web跨域请求 1.为什么要有跨域限制 举个例子: 1.用户登录了自己的银行页面 http://mybank.com,http://mybank.com向用户的cookie中添加用户标识. 2.用户浏览了恶意页面 http://evil.com.执行了页面中的恶意AJAX请求代码. 3.http://evil.com向http://mybank.com发起AJAX HTTP请求,请求会默认把http://mybank.com对应cookie也同时发送过去. 4.银行页面从发送的cookie中提取

  • 详解Django的CSRF认证实现

    什么是 CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用户点击这个恶意网站上的那个链接时,就会向你的网站发来一个请求,你的网站会以为这个请求是用户自己发来的,其实呢,这个请求是那个恶意网站伪造的. 1.csrf原理 csrf要求发送post,put或delete请求的时候,是先以get方式发送请求,服务端响应时会分配一个随机字符串给客户端,客户端第二次

  • django 取消csrf限制的实例

    # 导入包 from django.views.decorators.csrf import csrf_exempt # 使用装饰器即可避免csrf限制 @csrf_exempt def add_bookshelf(request): user_id = request.POST.get('user_id') print(user_id) return HttpResponse('123') 补充知识:Django 前后端分离跨域AJAX获取csrftoken及获取cookie时遇到的问题 获取

随机推荐