csrf 功能 及 csrf装饰器使用

简单了解csrf

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,
通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,
XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。与XSS攻击相比,
CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

防范措施 了解更多csrf点击

对于web站点,将持久化的授权方法(例如cookie或者HTTP授权)切换为瞬时的授权方法(在每个form中提供隐藏field),
这将帮助网站防止这些攻击。一种类似的方式是在form中包含秘密信息、用户指定的代号作为cookie之外的验证。
另一个可选的方法是“双提交”cookie。此方法只工作于Ajax请求,但它能够作为无需改变大量form的全局修正方法。
如果某个授权的cookie在form post之前正被JavaScript代码读取,那么限制跨域规则将被应用。
如果服务器需要在Post请求体或者URL中包含授权cookie的请求,那么这个请求必须来自于受信任的域,
因为其它域是不能从信任域读取cookie的。
与通常的信任想法相反,使用Post代替Get方法并不能提供卓有成效的保护。因为JavaScript能使用伪造的POST请求。
尽管如此,那些导致对安全产生“副作用”的请求应该总使用Post方式发送。Post方式不会在web服务器和代理服务器日志中留下数据尾巴,
然而Get方式却会留下数据尾巴。
尽管CSRF是web应用的基本问题,而不是用户的问题,但用户能够在缺乏安全设计的网站上保护他们的帐户:
通过在浏览其它站点前登出站点或者在浏览器会话结束后清理浏览器的cookie。

django 中 csrf

  • 配置文件

  • form表单使用

csrf装饰器

from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie#导入方法
csrf_exempt #某个视图函数不需要进行csrf校验
csrf_protect #某个视图函数需要进行csrf校验
ensure_csrf_cookie #确保生成csrf的cookie
  • csrf_exempt使用实例 不需要效验

#setting中CSRF中间件未注释
#使用方法一
from django.views import View
from django.shortcuts import render, redirect, HttpResponse
from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie class Login(View):
@method_decorator(csrf_exempt) #csrf_exempt只能加载dispatch上才有效果,所有的方法都不需要验证
def dispatch(self, request, *args, **kwargs):
ret = super().dispatch(request, *args, **kwargs)
return ret
def get(self, request, *args, **kwargs):
pass
def post(self, request, *args, **kwargs):
pass #使用方法二
from django.views import View
from django.shortcuts import render, redirect, HttpResponse
from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie @method_decorator(csrf_exempt,name="dispatch")
class Login(View):
def get(self, request, *args, **kwargs):
pass
def post(self, request, *args, **kwargs):
pass
#使用方法三
把csrf_exempt装饰器直接加在URL路由映射中,使某个视图函数不经过CSRF验证
from users import views
from django.views.decorators.csrf import csrf_exempt urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/',csrf_exempt(views.index)),
] #FBV使用直接加就行
@csrf_exempt
def index(request):
pass
  • csrf_protect 需要效验 ensure_csrf_cookie 确保生成csrf的cookie

  • 使用实例
#setting中CSRF中间件已注释
from django.views import View
from django.shortcuts import render, redirect, HttpResponse
from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie class Login(View):
@@method_decorator(ensure_csrf_cookie)
def get(self, request, *args, **kwargs):
pass
@method_decorator(csrf_protect)#post需要效验
def post(self, request, *args, **kwargs):
pass #FBV使用直接加就行
@csrf_protect
def index(request):
pass

csrf功能(执行流程)

  • csrf中间件中执行process_request

    • 1 从cookie中获取到csrftoken的值
    • 2 csrftoken的值放入到 request.META
  • 执行process_view

    • 1 查询视图函数是否使用csrf_exempt装饰器,使用了就不进行csrf的校验

    • 2 判断请求方式:

      • 1 如果是GET', 'HEAD', 'OPTIONS', 'TRACE' 不进行csrf校验

      • 2 其他的请求方式(post,put)

        • 进行csrf校验:

        • 获取cookie中csrftoken的值

        • 获取csrfmiddlewaretoken的值

          • 能获取到 ——》 request_csrf_token

          • 获取不到 ——》 获取请求头中X-csrftoken的值 ——》request_csrf_token

          • 比较上述request_csrf_token和cookie中csrftoken的值,比较成功接收请求,比较不成功拒绝请求。

作 者:郭楷丰
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角 推荐一下。您的鼓励是博主的最大动力!
自 勉:生活,需要追求;梦想,需要坚持;生命,需要珍惜;但人生的路上,更需要坚强。带着感恩的心启程,学会爱,爱父母,爱自己,爱朋友,爱他人。

csrf 功能 及 csrf装饰器使用的更多相关文章

  1. Python - Django - 在 CBV 中使用装饰器

    urls.py: from django.conf.urls import url from app02 import views urlpatterns = [ # app02 url(r'^app ...

  2. cbv装饰器 中间件 跨站请求伪造

    给cbv下面的函数加装饰器 写一个验证用户登录的程序 前端页面 # 写一个装饰器验证session def login_auth(func): def inner(request,*args,**kw ...

  3. Django CBV加装饰器、Django中间件、auth模块

    一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...

  4. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  5. python 装饰器的理解

    一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...

  6. 设计模式-装饰器模式(Decrator Model)

    文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...

  7. python基础-装饰器

    一.什么是装饰器 装饰器本质就是函数,功能是为其他函数附加功能 二.装饰器遵循的原则 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 三.实现装饰器的知识储备 装饰器=高阶函数+函数嵌套 ...

  8. Java设计模式12:装饰器模式

    装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...

  9. python 内置函数和函数装饰器

    python内置函数 1.数学相关 abs(x) 取x绝对值 divmode(x,y) 取x除以y的商和余数,常用做分页,返回商和余数组成一个元组 pow(x,y[,z]) 取x的y次方 ,等同于x ...

随机推荐

  1. SSM项目实战 之 EasyUI

    目录 EasyUI 简介 概述 使用EasyUI panel组件 简介 示例 JS形式及属性介绍 panel事件与方法 Window组件 概述 使用 行为 dialog 概述 使用 tabs组件 概述 ...

  2. 剑指offer:丑数

    题目描述: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解题 ...

  3. 范仁义html+css课程---7、表单

    范仁义html+css课程---7.表单 一.总结 一句话总结: 表单标签的话主要掌握form标签.input标签(以及input标签的不同的type值).select标签.textarea等标签,及 ...

  4. grandle Project sync failed.please fix your project and try again

    Android Studio导入项目或者新建项目想运行的时候可能会报错Gradle project sync failed. Please fix your project and try again ...

  5. Deep Reinforcement Learning with Iterative Shift for Visual Tracking

    Deep Reinforcement Learning with Iterative Shift for Visual Tracking 2019-07-30 14:55:31 Paper: http ...

  6. 大div套多个小div,怎样设置外div的高度自适应?

    在最后一个div 后面加上 overflow:hidden;如下: <div style="width:580px; height:auto; margin:0 auto; <d ...

  7. odoo开发笔记 -- 模型(类)继承的几种机制

    1. 类继承 2. 原型继承 3. 委托继承 待完善 https://www.cnblogs.com/chenshuquan/p/10523626.html

  8. IDEA查看接口的实现类

    查找接口的实现类: 快捷键 ctrl + alt +B 再按F2查看详细文档注解 查看类或接口的继承关系: ctrl + h

  9. mysql使用yum源安装各个版本的mysql数据库

    每次想用yum安装旧版本的mysql时,发现都找不到mysql的yum安装源,在官网只能找到最新版本mysql的yum源.后来才知道,原来最新的mysql的yum源也是包含了旧版本的mysql的yum ...

  10. webpack 4.0改版问题

    4.0之后的打包方式: webpack --mode development src/index.js --output-filename app.js --output-path dist