csrf 功能 及 csrf装饰器使用
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装饰器使用的更多相关文章
- Python - Django - 在 CBV 中使用装饰器
urls.py: from django.conf.urls import url from app02 import views urlpatterns = [ # app02 url(r'^app ...
- cbv装饰器 中间件 跨站请求伪造
给cbv下面的函数加装饰器 写一个验证用户登录的程序 前端页面 # 写一个装饰器验证session def login_auth(func): def inner(request,*args,**kw ...
- Django CBV加装饰器、Django中间件、auth模块
一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...
- PHP 装饰器模式
装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...
- python 装饰器的理解
一. 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷 ...
- 设计模式-装饰器模式(Decrator Model)
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/6057666.html 目录 1.概述 2.目的 3.结构组成 4.实现 5.总结 1.概 ...
- python基础-装饰器
一.什么是装饰器 装饰器本质就是函数,功能是为其他函数附加功能 二.装饰器遵循的原则 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 三.实现装饰器的知识储备 装饰器=高阶函数+函数嵌套 ...
- Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- python 内置函数和函数装饰器
python内置函数 1.数学相关 abs(x) 取x绝对值 divmode(x,y) 取x除以y的商和余数,常用做分页,返回商和余数组成一个元组 pow(x,y[,z]) 取x的y次方 ,等同于x ...
随机推荐
- SpringMVC(中)
一.传值方式 (1)Map Controller @Controller public class MyController { @RequestMapping("first") ...
- flask 实现最简单的登录功能
视图函数如下: # Sample.py from flask import Flask, render_template, url_for, request, redirect app = Flask ...
- Linux下emacs如何安装
ftp://ftp.gnu.org/gnu/emacs/ 下载对应版本编译安装 cd 自己想安装的目录 sudo wget ftp://ftp.gnu.org/gnu/emacs/emacs-24.4 ...
- 运维笔记--Linux查找指定目录下某段时间的文件
查找指定目录下,60天之前的文件:find /mnt/xml_data -mtime +60 -name "*.xml" 找到并统计数量:find /mnt/xml_data -m ...
- spark streaming流式计算---监听器
随着对spark的了解,有时会觉得spark就像一个宝盒一样时不时会出现一些难以置信的新功能.每一个新功能被挖掘,就可以使开发过程变得更加便利一点.甚至使很多不可能完成或者完成起来比较复杂的操作,变成 ...
- pytorch保证每次运行使用的随机数都相同的方法
其实在代码的开头添加下面几句话即可: # 保证训练时获取的随机数都是一样的 init_seed = torch.manual_seed(init_seed) torch.cuda.manual_see ...
- [LeetCode] 259. 3Sum Smaller 三数之和较小值
Given an array of n integers nums and a target, find the number of index triplets i, j, k with 0 < ...
- SpringBoot系列教程JPA之query使用姿势详解之基础篇
前面的几篇文章分别介绍了CURD中的增删改,接下来进入最最常见的查询篇,看一下使用jpa进行db的记录查询时,可以怎么玩 本篇将介绍一些基础的查询使用姿势,主要包括根据字段查询,and/or/in/l ...
- ActiveMQ学习教程
一.activemq安装 官网地址:https://activemq.apache.org/ 具体安装过程不赘述,解压即安装, 二.使用 activemq有queue和topic两种模式, 我们以qu ...
- LeetCode 704. 二分查找(Binary Search)
704. 二分查找 704. Binary Search 题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target,写一个函数搜索 nums 中的 target,如果 ...