为了保护应用程序和用户的利益,了解一般的安全攻击是由意义的, 了解所有 Web 应用程序的安全措施的需求和使用是必要的。
网络上存在许多流行的安全攻击,比如防止黑客攻击、恶意的站点请求、互联网的欺诈等等,其中跨站请求伪造(CSRF)就是其中之一 。
CSRF(Cross-site request forgery)也称为跨站点请求伪造。是一种对网站的攻击,主要由其他(恶意)网站或有时由网站上的(恶意)用户完成。
CSRF 攻击通常依赖于用户的身份。那么当用户访问恶意网站时会发生什么?该站点发送一些 JavaScript XMLHttpRequest 的隐藏形式。该请求使用用户(访问其恶意站点的用户)的凭据在信任用户浏览器或身份的 另一个网站上执行某些操作。
站点通常通过保存带有在浏览器中代表特定用户的标头和内容的 cookie 来识别经过身份验证的用户,攻击者使用它来访问用户的凭据以执行攻击。
在 settings.py 文件中添加 django.Middleware.csrf.CsrfViewMiddleware 来启用 CSRF 功能。
默认该中间件存在可以直接使用。
MIDDLEWARE = [\n ……\n "django.middleware.csrf.CsrfViewMiddleware",\n ……\n]CSRF 装饰器
csrf_protect 装饰器就具有与 CsrfViewMiddleware 相同的功能,但仅适用于分配给其的视图。
方法1:Views 视图中添加。
from django.conf.urls import url\nfrom django.views.decorators.csrf import csrf_exempt\nimport views\n\nurlpatterns = [\n url(r'^xview', csrf_exempt(views.xView.as_view()), name='xview'),\n]
为了避免疏漏或者遗忘,建议在 settings.py 中全局设置 CsrfViewMiddleware 。
CSRF 令牌s是站点特有的字母数字代码或随机秘密值。在 Django 中,令牌由CsrfViewMiddleware 在 settings.py 文件中设置。
所有传出请求中都存在一个带有 csrfmiddlewaretoken 字段的隐藏表单字段。当表单提交给服务器但它没有发送时,服务器不会接受该请求(除非具有与服务器识别的 CSRF 令牌匹配的 CSRF 令牌)。
所有传入的请求都必须有一个 CSRF cookie,并且 csrfmiddlewaretoken 字段必须存在且正确。否则将收到 403 错误信息。
在 Django 中使用模板标签就可以使用 CSRF 保护。
{% csrf_token %}
在使用 POST 方法提交表单的模板中,在<form 元素中使用 csrf_token 。
<form action="" method="post"\n {% csrf_token %}\n</formJavaScript 查询 csrftoken
从 Django 的 csrf_token cookie中 获取 csrf 令牌,只有在 Django 中启用了 CSRF 中间件时才会设置。
function getCookie(name) {\n let cookieValue = null;\n\n if (document.cookie && document.cookie !== '') {\n const cookies = document.cookie.split(';');\n for (let i = 0; i < cookies.length; i++) {\n const cookie = cookies[i].trim();\n\n // Does this cookie string begin with the name we want?\n if (cookie.substring(0, name.length + 1) === (name + '=')) {\n cookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n\n break;\n }\n }\n }\n\n return cookieValue;\n}\n\n\nconst csrftoken = getCookie('csrftoken');\nconsole(csrftoken)\n
创建一个具有以下内容的全局 csrftoken.js 文件。
import React from 'react';\n\nconst csrftoken = getCookie('csrftoken');\n\nconst CSRFTOKEN = () = {\n return (\n <input name="csrfmiddlewaretoken" value={csrftoken} type="hidden" /\n );\n};\n\nexport default CSRFTOKEN;\n
导入包含需要提交数据的表单中。
import CSRFTOKEN from './csrftoken';\n\nclass SampleForm extends Component {\n render() {\n return (\n <form action="/" method="POST"\n <CSRFTOKEN /\n …\n </form\n );\n }\n}\n\nexport default SampleForm;\nReact 中分配 X-CSRF Token
fetch(url, {\n credentials: 'include',\n method: 'POST',\n mode: 'same-origin',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'X-CSRFToken': csrftoken\n },\n body: {}\n })\n }\nSettings.py 参数说明
设置的很多内容延续了 Django 3.x 的内容。
CSRF cookie的生存时间(以秒为单位)。
CSRF_COOKIE_AGE = 31449600CSRF_COOKIE_DOMAIN
设置 CSRF Cookie 时要使用的站点域。
CSRF_COOKIE_DOMAIN = NoneCSRF_COOKIE_HTTPONLY
是否 HttpOnly 在CSRF cookie上使用标志。设置为 True,客户端 JavaScript 将无法访问 CSRF cookie。
CSRF_COOKIE_HTTPONLY = FalseCSRF_COOKIE_NAME
用于CSRF身份验证令牌的cookie的名称。
CSRF_COOKIE_NAME = 'csrftoken'CSRF_COOKIE_PATH
设置 CSRF Cookie 的路径。
CSRF_COOKIE_PATH = '/'CSRF_COOKIE_SAMESITE
CSRF cookie上 SameSite 标志的值,此标志可防止 Cookie 在跨站点请求中发送。
CSRF_COOKIE_SAMESITE = 'Lax'CSRF_COOKIE_SECURE
是否对 CSRF cookie 使用安全 cookie。
CSRF_COOKIE_SECURE = FalseCSRF_USE_SESSIONS
是否将 CSRF Token 存储在用户的 sessions 中,而不是存储在 cookie 中。
CSRF_USE_SESSIONS = FalseCSRF_FAILURE_VIEW
当 CSRF 保护拒绝传入请求时将使用的视图函数的路径。
CSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'CSRF_HEADER_NAME
用于CSRF身份验证的请求标头的名称。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。