需要 CSRF 令牌吗?

CSRF Token Needed?

好吧,我仍然在努力思考它们是什么,并且需要......相信我,我已经阅读了很多关于它的内容并且认为我理解但我可能不没...

我能得到的最接近的结果是,当您的网站上有任何形式的登录页面时,绝对需要它们...

我的问题是,当您有基本的联系表格 and/or 出于任何原因填写表格时...您需要为这些页面提供 CSRF 令牌吗?

CSRF 令牌不是 'definitely needed'(例如,表单在没有它们的情况下也能正常工作)但它们是一个非常好的主意 每当从一个网页向另一个网页提交任何数据时 webpage/script。 几乎没有办法相信 page 2 收到的任何数据都来自 page 1(请阅读下图)。隔离的每个页面都不知道用户之前在哪个页面上,甚至像 $_SERVER['HTTP_REFERER'] 这样旨在暗示这一点的东西也很容易被浏览器用户操纵。

CSRF 令牌是一个 page-to-page 密钥,使接收页面更加信任访问者来自预期的发件人页面。部署 属性 它们还可以防止数据重复,这也是一个很大的好处,可以减少肆无忌惮的垃圾邮件和浪费的 CPU 周期。


CSRF 令牌可用于的一个方面:

假设您在页面上有一个表单,该页面名为 page1.php 并且表单是 send contact email,其中填写表单然后发送,它被发送到的页面( page2.php) 可以构建联系人电子邮件,然后将其发送给目标收件人。

由此下一步有人可以阅读 page1.php 表单的源代码。这非常简单,可以告诉人们存在哪些 $_POST 值以及表单发送到的目的地位置 (page2.php)。

一个简单的用户将加载您的 page1.php ,在按下 SEND 按钮并提交表格之前,花十分钟写一封措辞谨慎的电子邮件。关闭表单转到 page2.php,它将其详细信息构建到发送到 receiver@email.com.

的电子邮件中

现在,如果有人从 page1.php 获取源代码,他们可以使用简单的 PHP 脚本(或任何其他代码)处理将成百上千的垃圾邮件表单发送到 page2.php,他们每个人都有正确的细节来生成和发送电子邮件,这可以用于各种恶意的过程,他们可以从许多其他网站、互联网的任何其他部分甚至从整个僵尸网络发送表格,如果他们选择的话-- page2.php 每秒会被许多请求淹没,电子邮件的接收者的邮箱将塞满无用的 form-generated 邮件。

输入 CSRF 令牌

CSRF 令牌是保存在表单中的唯一密钥,在 page1.php 生成时通常(但不完全)使用(可能随机)生成的 $_SESSION 值,以便当表单已提交,$_POST 数据被发送到 page2.php 这是一个相当可靠的检查,表明表单是从同一网站 提交的 。因此,不是让整个僵尸网络向 page2.php 提交数据并导致许多电子邮件,而是没有对数据采取行动,而是只有从同一网站提交的页面在 page2.php 脚本中被 运行 .

另外,如果发生上述情况,您还可以跟踪不良提交的来源,并使用其他进程/脚本来阻止/禁止各种其他僵尸网络/服务器向您的服务器提交数据。


上图是一种保险和过程控制的形式,因此您具有很强的可靠性,即在 page2.php:

上通过 CSRF 的数据
 if ($_SESSION['key'] === $_POST['key']){
     unset($_SESSION['key']);   ///prevent repetition
      ...
      send email
    }

(例如)。

if 语句仅 运行 包含从可靠来源 (page1.php) 可靠提交的表单数据。因此,防止其他服务器搭载您的脚本,防止 DOS 攻击的粗暴尝试使您的 page2.php 过载以及其他各种积极因素知道 page1.php 发送了正在 page2.php 上使用的数据。

另一方面CSRF令牌用于

在上面的代码中看到我取消了 $_SESSION CSRF 值?这意味着,如果您按 F5 或以其他方式刷新 page2.php 访问(将其输入浏览器或其他任何内容),它不会重新提交两次真实数据 。这可以帮助防止人们填写一次表格然后像论坛上愤怒的少年一样不断地重新提交它(POST 数据总是保存在页面 HTTP header 并在页面被调用,因此取消设置 PHP 中的 $_POST 数据毫无意义。 ).


CSRF is a security mechanism that - when the CSRF token test is passed - means you can reliably judge that data sent to a script on your server came from a valid and intended source.