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
类属性中:
from masonite.middleware import VerifyCsrfToken as Middleware
class VerifyCsrfToken(Middleware):
exempt = ['/oauth/github']
现在任何到 your-domain.com/oauth/github
的 POST 路由都不受 CSRF 保护,并且不会对该路由进行检查。谨慎使用它,因为 CSRF 保护对应用程序安全至关重要,但你可能会发现并非所有路由都需要它。
豁免多个路由
你还可以使用 *
通配符来豁免同一前缀下的多个路由。例如,你可能会发现自己需要这样做:
from masonite.middleware import VerifyCsrfToken as Middleware
class VerifyCsrfToken(Middleware):
exempt = [
'/api/document/reject-reason',
'/api/document/*/reject',
'/api/document/*/approve',
'/api/document/*/process/@user',
]
...
这可能会有点重复,因此你可以指定通配符:
from masonite.middleware import VerifyCsrfToken as Middleware
class VerifyCsrfToken(Middleware):
exempt = [
'/api/document/*',
]
...
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。