CSRF 保护

简介

跨站请求伪造是一种通过伪装授权用户的请求来利用授信网站的恶意漏洞。Django使得防止应用遭到跨站请求伪造攻击变得简单。

Django自动为每一个被应用管理的有效用户会话生成一个 CSRF 令牌,该令牌用于验证授权用户和发起请求者是否是同一个人。

任何时候在 Django应用中定义HTML表单,都需要在表单中引入CSRF令牌字段,这样CSRF保护中间件才能够正常验证请求。想要生成包含 CSRF 令牌的隐藏输入字段,可以使用辅助函数 csrf_field 来实现:

<form method="POST" action="/profile">

   {{ csrf_token }}

   ...

</form>

中间件组 web 中的中间件django.middleware.csrf.CsrfViewMiddleware会自动为我们验证请求输入的 token 值和 Session 中存储的 token是否一致。

CSRF 保护中排除指定 URL

有时候我们需要从 CSRF 保护中排除一些 URL,这个时候我们就要应用csrf_exempt装饰器取消csrftoken验证。
通过csrf_exempt, 来取消csrftoken验证,方式有两种。
1 .在视图函数当中添加csrf_exempt装饰器
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def post_data(request):
    pass
2 .在urlconf当中

from django.views.decorators.csrf import csrf_exempt
urlpatterns = [ url( r'^post/get_data/$', csrf_exempt(post_data), name= 'post_data'),]

X-CSRF-Token

除了将 CSRF 令牌作为 POST 参数进行验证外,还可以通过设置 X-CSRF-Token 请求头来实现验证,VerifyCsrfToken 中间件会检查 X-CSRF-TOKEN 请求头,首先创建一个 meta 标签并将令牌保存到该 meta 标签:

<meta name="csrf-token"content="{{ csrf_token() }}">

然后在 js 库(如 jQuery)中添加该令牌到所有请求头,这为基于 AJAX 的应用提供了简单、方便的方式来避免 CSRF 攻击:

$.ajaxSetup({

   headers: {

       'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')

    }

});

X-XSRF-Token

Django还会将 CSRF 令牌保存到名为 XSRF-TOKEN  Cookie 中,你可以使用该 Cookie 值来设置 X-XSRF-TOKEN请求头。一些 JavaScript 框架,比如  Angular,会为你自动进行设置,基本上你不太需要手动设置这个值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值