Django 4.x CSRF 站点保护示例和使用配置方法

有时在不考虑安全性的情况下构建网站会更容易。大多数初学者可能会忘记考虑基本安全措施的必要性。 在不关注安全和互联网请求协议的情况下,构建网站或 Web 应用程序可以说更容易。

为了保护应用程序和用户的利益,了解一般的安全攻击是由意义的, 了解所有 Web 应用程序的安全措施的需求和使用是必要的。

网络上存在许多流行的安全攻击,比如防止黑客攻击、恶意的站点请求、互联网的欺诈等等,其中跨站请求伪造(CSRF)就是其中之一 。

在 Django 中,有几种方法可以防止 CSRF 攻击。而对于 Django 开发者来说 Django 针对 CSRF 攻击的措施是值得关注的。


CSRF 是什么?

CSRF(Cross-site request forgery)也称为跨站点请求伪造。是一种对网站的攻击,主要由其他(恶意)网站或有时由网站上的(恶意)用户完成。

CSRF 攻击通常依赖于用户的身份。那么当用户访问恶意网站时会发生什么?该站点发送一些 JavaScript XMLHttpRequest 的隐藏形式。该请求使用用户(访问其恶意站点的用户)的凭据在信任用户浏览器或身份的 另一个网站上执行某些操作。

站点通常通过保存带有在浏览器中代表特定用户的标头和内容的 cookie 来识别经过身份验证的用户,攻击者使用它来访问用户的凭据以执行攻击。



Django 的 CSRF 使用

CSRF 配置

在 settings.py 文件中添加 django.middleware.csrf.CsrfViewMiddleware 来启用 CSRF 功能。

默认该中间件存在可以直接使用。

MIDDLEWARE = [    ......    "django.middleware.csrf.CsrfViewMiddleware",    ......]

CSRF 装饰器

csrf_protect 装饰器就具有与 CsrfViewMiddleware 相同的功能,但仅适用于分配给其的视图。

方法1:Views 视图中添加。

from django.shortcuts import render from django.views.decorators.csrf import csrf_protect @csrf_protect def Request(request):       if request.method == 'POST':           data = xxx.objects.all()           # ...             return render(request, "xxxx.html", {"data":data})

方法2:Urls 路由中添加。

from django.conf.urls import urlfrom django.views.decorators.csrf import csrf_exemptimport viewsurlpatterns = [    url(r'^xview', csrf_exempt(views.xView.as_view()), name='xview'),]

为了避免疏漏或者遗忘,建议在 settings.py 中全局设置 CsrfViewMiddleware 。

CSRF Token

CSRF 令牌s是站点特有的字母数字代码或随机秘密值。在 Django 中,令牌由CsrfViewMiddleware 在 settings.py 文件中设置。

所有传出请求中都存在一个带有 csrfmiddlewaretoken 字段的隐藏表单字段。当表单提交给服务器但它没有发送时,服务器不会接受该请求(除非具有与服务器识别的 CSRF 令牌匹配的 CSRF 令牌)。

所有传入的请求都必须有一个 CSRF cookie,并且 csrfmiddlewaretoken 字段必须存在且正确。否则将收到 403 错误信息。



启用 Django REST 和 React 保护

Html 模板

在 Django 中使用模板标签就可以使用 CSRF 保护。

{% csrf_token %}

在使用 POST 方法提交表单的模板中,在

元素中使用 csrf_token 。

    {% csrf_token %}

JavaScript 查询 csrftoken

从 Django 的 csrf_token cookie中 获取 csrf 令牌,只有在 Django 中启用了 CSRF 中间件时才会设置。

function getCookie(name) {    let cookieValue = null;    if (document.cookie && document.cookie !== '') {        const cookies = document.cookie.split(';');        for (let i = 0; i < cookies.length; i++) {            const cookie = cookies[i].trim();            // Does this cookie string begin with the name we want?            if (cookie.substring(0, name.length + 1) === (name + '=')) {                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));                break;            }        }    }    return cookieValue;}const csrftoken = getCookie('csrftoken');console(csrftoken)

创建一个具有以下内容的全局 csrftoken.js 文件。

import React from 'react';const csrftoken = getCookie('csrftoken');const CSRFTOKEN = () => {    return (            );};export default CSRFTOKEN;

导入包含需要提交数据的表单中。

import CSRFTOKEN from './csrftoken';class SampleForm extends Component {    render() {        return (                 
... ); }}export default SampleForm;

React 中分配 X-CSRF Token

fetch(url, {    credentials: 'include',    method: 'POST',    mode: 'same-origin',    headers: {      'Accept': 'application/json',      'Content-Type': 'application/json',      'X-CSRFToken': csrftoken    },    body: {}   })  }

Settings.py 参数说明

设置的很多内容延续了 Django 3.x 的内容。

CSRF_COOKIE_AGE

CSRF cookie的生存时间(以秒为单位)。

CSRF_COOKIE_AGE = 31449600

CSRF_COOKIE_DOMAIN

设置 CSRF Coo​kie 时要使用的站点域。

CSRF_COOKIE_DOMAIN = None

CSRF_COOKIE_HTTPONLY

是否 HttpOnly 在CSRF cookie上使用标志。设置为 True,客户端 JavaScript 将无法访问 CSRF cookie。

CSRF_COOKIE_HTTPONLY = False

CSRF_COOKIE_NAME

用于CSRF身份验证令牌的cookie的名称。

CSRF_COOKIE_NAME = 'csrftoken'

CSRF_COOKIE_PATH

设置 CSRF Coo​​kie 的路径。

CSRF_COOKIE_PATH = '/'

CSRF_COOKIE_SAMESITE

CSRF cookie上 SameSite 标志的值,此标志可防止 Cookie 在跨站点请求中发送。

CSRF_COOKIE_SAMESITE = 'Lax'

CSRF_COOKIE_SECURE

是否对 CSRF cookie 使用安全 cookie。

CSRF_COOKIE_SECURE = False

CSRF_USE_SESSIONS

是否将 CSRF Token 存储在用户的 sessions 中,而不是存储在 cookie 中。

CSRF_USE_SESSIONS = False

CSRF_FAILURE_VIEW

当 CSRF 保护拒绝传入请求时将使用的视图函数的路径。

CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'

CSRF_HEADER_NAME

用于CSRF身份验证的请求标头的名称。

CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'

CSRF_TRUSTED_ORIGINS

阻止不安全请求(POST、PUT、DELETE)的来源的主机列表。

CSRF_TRUSTED_ORIGINS = []
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章