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

  • Post category:Python

Django中的csrf_protect()函数用于防止跨站请求伪造(Cross-Site Request Forgery, CSRF)攻击,通过在每个表单提交时生成一个CSRF认证token,并在后台验证该token的方式,确保只有站点上已登录的用户才能提交表单请求。

使用csrf_protect()函数非常简单,只需要在Django视图函数中使用该装饰器即可。下面是一个简单的示例,其中index是视图函数的名称:

from django.views.decorators.csrf import csrf_protect

@csrf_protect
def index(request):
    # 此处是处理index视图函数的代码

该示例中使用了@csrf_protect装饰器将index函数进行了装饰,这样在该函数中所有的表单都会自动添加CSRF token验证。

下面是一个更详细的示例,演示如何在Django中使用csrf_protect()函数:

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

# 第一个视图函数,返回一个包含表单的网页
def show_form(request):
    return render(request, 'form.html')

# 第二个视图函数,处理提交的表单数据
@csrf_protect
def process_form(request):
    if request.method == 'POST':
        # 处理表单数据的代码
        return render(request, 'success.html')
    else:
        return render(request, 'error.html')

在该示例中,我们定义了两个视图函数:show_formprocess_formshow_form函数用于展示包含表单的页面,process_form函数用于处理提交的表单数据。

注意:process_form函数需要在表单提交时使用csrf_protect()装饰器进行保护,可以看到我们在上面的代码中已经进行了装饰。

在模板文件form.html中,我们需要添加如下代码来生成表单并添加CSRF token:

{% extends "base.html" %}
{% block content %}
  <h2>Example Form</h2>
  <form method="post" action="{% url 'process_form' %}">
    {% csrf_token %}
    <!-- 其他表单元素 -->
    <button type="submit">Submit</button>
  </form>
{% endblock %}

在该代码中,我们使用了{% csrf_token %}标签来自动生成一个带有CSRF token的<input>标签。这样在表单提交时,就可以自动验证该token,确保只有已登录的用户才能提交表单数据。

总结:

使用csrf_protect()函数,我们可以轻松地保护Django站点中的所有表单免受跨站请求伪造攻击的影响。只需要在视图函数中使用@csrf_protect装饰器,并在表单中添加{% csrf_token %}标签即可。在处理POST请求时,Django会自动验证表单中的CSRF认证token,从而保障站点安全。