详解Django的 csrf_protect() 函数:装饰器,保护跨站请求伪造攻击

  • Post category:Python

csrf_protect()函数是Django框架中的一个装饰器函数,用于为视图函数添加跨站请求伪造保护。

作用

跨站请求伪造(CSRF)攻击是一种方式,通过模拟合法用户发送请求来实现非法操作的攻击。Django的csrf_protect()函数可以保护网站免受此类攻击。

具体地,csrf_protect()函数会在请求到达视图函数之前,检查请求的CSRF令牌(CSRF Token)是否符合预期。如果符合,则继续处理请求,如果不符合,则会中止请求并返回一个HTTP 403禁止访问的错误。

使用方法

在Django中使用csrf_protect()函数非常简单,只需要在视图函数定义前添加该装饰器即可:

from django.views.decorators.csrf import csrf_protect

@csrf_protect
def my_view(request):
    # 处理请求

此外,Django也提供了全局的CSRF保护,只需要在settings.py中设置MIDDLEWARE配置项即可:

MIDDLEWARE = [
    # ... 其他中间件
    'django.middleware.csrf.CsrfViewMiddleware',
    # ... 其他中间件
]

该中间件会自动为所有表单请求生成CSRF令牌,并检查请求的令牌是否符合预期,如果不符合,则返回一个HTTP 403禁止访问的错误。

示例

下面是两个使用csrf_protect()函数的示例:

示例一

在一个简单的表单视图函数中添加保护:

from django.shortcuts import render
from django.views.decorators.csrf import csrf_protect

@csrf_protect
def my_form_view(request):
    if request.method == 'POST':
        # 处理POST请求数据
        return render(request, 'success.html')
    else:
        # 渲染表单
        return render(request, 'form.html')

示例二

在一个基于类的视图函数中添加保护:

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_protect
from django.views.generic import TemplateView

@method_decorator(csrf_protect, name='dispatch')
class MyView(TemplateView):
    template_name = 'my_template.html'

以上是关于csrf_protect()函数的使用方法和作用的详细讲解,希望对您有所帮助。