django网站实例(Django)

有时在不考虑安全性的情况下构建网站会更容易。大多数初学者可能会忘记考虑基本安全措施的必要性。 在不关注安全和互联网请求协议的情况下,构建网站或 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 url
from django.views.decorators.csrf import csrf_exempt
import views

urlpatterns = [
url(r'^xview', csrf_exempt(views.xView.as_view()), name='xview'),
]为了避免疏漏或者遗忘,建议在 settings.py 中全局设置 CsrfViewMiddleware 。CSRF TokenCSRF 令牌s是站点特有的字母数字代码或随机秘密值。在 Django 中,令牌由CsrfViewMiddleware 在 settings.py 文件中设置。所有传出请求中都存在一个带有 csrfmiddlewaretoken 字段的隐藏表单字段。当表单提交给服务器但它没有发送时,服务器不会接受该请求(除非具有与服务器识别的 CSRF 令牌匹配的 CSRF 令牌)。所有传入的请求都必须有一个 CSRF cookie,并且 csrfmiddlewaretoken 字段必须存在且正确。否则将收到 403 错误信息。启用 Django REST 和 React 保护Html 模板在 Django 中使用模板标签就可以使用 CSRF 保护。{% csrf_token %}在使用 POST 方法提交表单的模板中,在<form> 元素中使用 csrf_token 。<form action="" method="post">
{% csrf_token %}
</form>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 (
<input name="csrfmiddlewaretoken" value={csrftoken} type="hidden" />
);
};

export default CSRFTOKEN;
导入包含需要提交数据的表单中。import CSRFTOKEN from './csrftoken';

class SampleForm extends Component {
render() {
return (
<form action="/" method="POST">
<CSRFTOKEN />

</form>
);
}
}

export default SampleForm;
React 中分配 X-CSRF Tokenfetch(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_AGECSRF cookie的生存时间(以秒为单位)。CSRF_COOKIE_AGE = 31449600CSRF_COOKIE_DOMAIN设置 CSRF Coo​kie 时要使用的站点域。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 Coo​​kie 的路径。CSRF_COOKIE_PATH = '/'CSRF_COOKIE_SAMESITECSRF 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身份验证的请求标头的名称。CSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'CSRF_TRUSTED_ORIGINS阻止不安全请求(POST、PUT、DELETE)的来源的主机列表。CSRF_TRUSTED_ORIGINS = []


本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://www.xiaosb.com/beian/49683/