CSRF 保护

未匹配的标注
本文档最新版为 4.0,旧版本可能放弃维护,推荐阅读最新版!

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/*',
    ]

    ...

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/masonite/2.3/se...

译文地址:https://learnku.com/docs/masonite/2.3/se...

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~