Django 中的 CSRF 令牌是什么?


CSRF 代表跨站请求伪造,当恶意网站欺骗用户无意中加载来自他们之前已进行身份验证的网站的 URL 时,就会发生这种攻击,从而利用他们的状态并危及数据。

为了理解 CSRF 攻击究竟是什么,让我们来看一个例子。假设您已登录 csrfexample.com 的网络邮件帐户。

此网络邮件网站上的“注销”按钮指向 URL csrfexample.com/logout。也就是说,您只需访问页面 csrfexample.com/logout 即可注销。

一个恶意网站可以通过在其页面上隐藏该 URL 来强制您访问 csrfexample.com/logout,这几乎肯定是恶意的。

如果您已登录您的 csrfexample.com 帐户并访问包含指向 csrfexample.com/logout 的链接的恶意页面,您将被注销 csrfexample.com。

显然,在您不知情的情况下被注销网络邮件服务并不是一个严重的安全性问题,但如果同样的入侵发生在网上银行或电子商务网站上,则可能非常危险。

由于 CSRF 是一种常见的威胁,因此 Django 提供了一种简单的方法来防止它。

Django CSRF 令牌

Django 提供了一个百分比 csrf 令牌百分比标签,用于防止恶意攻击。在服务器上生成页面时,它会生成一个令牌,并确保任何返回的请求都针对此令牌进行交叉检查。该令牌不包含在传入请求中;因此它们不会被执行。

以下代码片段摘自一个单词计数 Django 项目。在该项目中,Django 渲染了一个包含表单的 html 页面,该表单获取用户的文本输入并返回该文本的单词计数。

在此表单中,插入 csrf 令牌以防止对这些数据的攻击。

<h1>
   WORD COUNT
</h1>
<a href="/home/">My Home</a>
{% csrf_token %} //csrf token inserted here.
<form action="count">
   <textarea cols="50" rows="10" name="FullText"></textarea>
   <br/>
   <input type="submit" value="CountMe"/>
</form>

防止 CSRF 攻击

以下是防止 csrf 攻击的步骤。

  • 第一步是确保所有 GET 请求都没有副作用。这样,如果恶意网站将您的页面之一包含为 ,则不会产生负面影响。

  • 剩下的就是处理 POST 请求了。因此,我们继续下一步。

  • 第二步是为每个 POST 提供一个隐藏字段,其值是秘密的,并且是从用户的会话 ID 生成的。

  • 然后,在服务器端处理表单时,检查该秘密字段,如果它未通过验证,则引发错误。

为了防止 csrf 攻击,Django 提供了内置中间件。

django.contrib.csrf 包仅包含一个模块:middleware.py。此模块包含一个 Django 中间件类 CsrfMiddleware,它实现了 CSRF 保护。

要激活此 CSRF 保护,请将 'django.contrib.csrf.middleware.CsrfMiddleware' 添加到 settings 文件中的 MIDDLEWARE_CLASSES 设置中。

此中间件需要在 SessionMiddleware 之后处理响应,因此 CsrfMiddleware 必须出现在 SessionMiddleware 之前。这是因为响应中间件是按照从后到前的顺序处理的。

更新于:2022 年 9 月 2 日

13K+ 浏览量

启动你的 职业生涯

通过完成课程获得认证

开始
广告