CSRF令牌需要吗?

时间:2016-08-16 18:26:20

标签: php csrf contact-form csrf-protection

好的,仍然试图把我们的头脑包裹起来,并且需要...相信我,我已经阅读了很多内容并且想起我理解但是我可能不会这样做。 t ...

我最接近的是,当您在网站上以任何形式登录页面时,他们确实

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

1 个答案:

答案 0 :(得分:3)

CSRF令牌不是'肯定需要' (因为,表单在没有它们的情况下可以正常工作)但是每当提交任何内容时,它们都是非常好的主意从一个网页到另一个网页/脚本的数据。任何数据page 2收到来自page 1 信任 的方式非常少(请参阅下面的插图)。隔离中的每个页面都不知道用户之前在哪个页面上,甚至可以通过浏览器用户轻松操纵那些旨在暗示这一点的内容,例如$_SERVER['HTTP_REFERER']

CSRF 令牌是一种页面到页面的密钥,为接收页面提供了更高级别的信任,访问者来自预期的发件人页面。部署属性他们也可以防止数据重复,这也是一个很大的好处,减少了不道德的垃圾邮件和浪费的CPU周期。

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

假设您在页面上有一个表单,该页面名为page1.php,表单为send contact email,表单已填写然后发送,页面已发送to(page2.php)可以构建然后向预期的收件人发送联系电子邮件。

从这一点开始,下一步是有人可以阅读page1.php表单的源代码。这非常容易,并告诉人们存在$_POST值以及表单发送到的目的地的位置(page2.php)。

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

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

输入CSRF令牌

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

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

上图是保险和流程控制的一种形式,因此您可以通过page2.php上的CSRF获得强大的可靠性:

page2.php

(例如)。

if ($_SESSION['key'] === $_POST['key']){ unset($_SESSION['key']); ///prevent repetition ... send email } 语句仅与可靠来源(if)可靠提交的表单数据一起运行。因此,防止其他服务器在您的脚本上捎带,防止在DOS攻击中发生重大攻击,使page1.php以及其他各种积极因素都知道page2.php发送了page1.php上正在使用的数据。

CSRF令牌的另一个方面用于

请参阅上面的代码,我取消设置page2.php CSRF值?这意味着如果您按F5或以其他方式刷新$_SESSION访问(在浏览器中输入等等),它将不会重新提交两次真实数据。这有助于防止人们填写表格一次,然后像论坛上的愤怒少年一样不断重新提交( POST数据始终保存在页面HTTP标题中,并在调用页面时重新提交,因此取消设置{{1} PHP中的数据毫无意义。)。

  

CSRF是一种安全机制 - 当CSRF令牌测试通过时 - 意味着您可以可靠地判断发送到服务器上的脚本的数据来自有效且有意的来源。