csrf 功能 及 csrf装饰器使用
- 2019 年 10 月 8 日
- 筆記
目录
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的值,比较成功接收请求,比较不成功拒绝请求。
作 者:郭楷丰