CSRF 保护
CSRF 保护
简介
CSRF 保护通常需要该页面请求的用户设置与服务器上的相同令牌匹配的唯一令牌。这可以阻止任何人在没有正确令牌的情况下提交表单。有许多在线资源可以讲解 CSRF 做什么以及如何工作,但 Masonite 使其非常易于使用。
入门
Masonite 的 CSRF 功能位于CsrfProvider
服务提供程序和CsrfMiddleware
中。如果您不希望获得CSRF 保护,则可以完全地删除这两个功能。
CsrfProvider
只需将 CSRF 功能加载到容器中,而CsrfMiddleware
实际生成密钥并检查它们是否有效。
模板
默认情况下,所有POST
请求都需要 CSRF 令牌。我们可以通过在表单中添加{{csrf_field}}
标签来在表单中添加 CSRF 令牌:
<form action="/dashboard" method="POST">
{{ csrf_field }}
<input type="text" name="first_name">
</form>
这将添加一个隐藏字段,如下所示:
<input type="hidden" name="__token" value="8389hdnajs8...">
如果更改或操纵了此令牌,Masonite 将从中间件内部引发InvalidCsrfToken
异常。
如果您尝试不带{{csrf_field}}
的POST
请求,那么您将收到InvalidCsrfException
异常。这只是意味着您或者缺少 Jinja2 标记,或者您缺少来自中间件中的exempt
类属性的路由。
您还可以获得生成的令牌。这对于JS 前端非常有用,您需要将 CSRF 令牌通过 AJAX 调用传递到后端 。
<p> Token: {{ csrf_token }} </p>
AJAX / Vue / Axios
对于 Ajax 调用,传递 CSRF 令牌的最佳方法是通过在meta
标记内的父模板中设置令牌,如下所示:
<meta name="csrf-token" content="{{ csrf_token }}">
然后,您可以获取令牌并将其放在需要的地方:
token = document.head.querySelector('meta[name="csrf-token"]')
然后,您可以通过X-CSRF-TOKEN
头传递令牌,而不是__ token
输入传递令牌,以便于使用。
豁免路由
并非所有路由都需要 CSRF 保护,例如 OAuth 身份验证或各种 Webhook。为了免除路由的保护,我们可以将其添加到位于app / http / middleware / CsrfMiddleware.py
的中间件中的exempt
类属性中:
class CsrfMiddleware:
"""Verify CSRF Token Middleware
"""
exempt = [
'/oauth/github'
]
...
现在,任何到your-domain.com/oauth/github
的 POST 路由都不受 CSRF 保护,并且不会对此路由进行检查。因为 CSRF 保护对于应用程序安全性至关重要,因此请谨慎使用此选项,但您可能会发现并非所有路由都需要它。
豁免多条路由
您也可以使用*
通配符来排除相同前缀下的多条路由。例如,您可能会发现自己需要这样做:
class CsrfMiddleware:
"""Verify CSRF Token Middleware
"""
exempt = [
'/api/document/reject-reason',
'/api/document/@id/reject',
'/api/document/@id/approve',
'/api/document/@id/process/@user',
]
...
这可能会有些重复,因此您可以指定一个通配符:
class CsrfMiddleware:
"""Verify CSRF Token Middleware
"""
exempt = [
'/api/document/*',
]
...
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。