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

  • Post category:Python

csrf_protect()是Django里专门用于防止跨站请求伪造攻击(CSRF)的中间件函数。该函数对使用POST、PUT、DELETE等非安全请求方式的页面或接口进行CSRF攻击的保护,确保只有从您的站点发出的请求才会被视为有效请求,有效提高了站点安全性。

该函数应该被用来装饰Django视图函数中的“非安全”及包含表单的请求方法,例如通过POST方式提交表单时的视图函数,其使用方式如下:

from django.views.decorators.csrf import csrf_protect

@csrf_protect
def my_view(request):
   # view code
   pass

示例1:在模板中使用csrf_token标签,保护POST请求

通过在表单中添加一个csrf_token标签,并使用{% csrf_token %}模板标签生成一个隐藏的input,可以有效防止跨站攻击。通过添加csrf_token标签,标记了请求来源,从而保证了POST请求中表单的来源唯一性,防止了攻击者通过伪造请求绕过登录校验进行其他违规操作。

{% extends "base.html" %}

{% block content %}
    <form method="post">
    {% csrf_token %}
        <label for="username">Username:</label>
        <input type="text" name="username" id="username">
        <label for="password">Password:</label>
        <input type="password" name="password" id="password">
        <button type="submit">Submit</button>
    </form>
{% endblock %}

示例2:直接使用csrf_protect函数保护POST请求

如果你想在视图函数中显式地包含csrf保护,而不使用模板标签,你可以在该视图函数中使用csrf_protect函数进行保护。

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

@csrf_protect
def handle_form(request):
    if request.method == 'POST':
        # 处理POST请求
        pass
    else:
        # 显示GET请求的表单
        return render(request, 'form.html')

总结:csrf_protect()函数是一项重要的安全措施,用于防范跨站请求攻击。正确认识和使用该函数,可以有效地保护站点数据和用户隐私,提高系统的安全性。