2016-08-16 50 views
0

好吧,仍然试图环绕它们是什么我的头,并且需要..believe我我读过它丰富和认为我理解,但我可能不...需要CSRF令牌吗?

最接近我可以得到的是,他们是绝对当您在您的网站上以任何形式登录页面时需要...

我的问题是当您有任何基本联系表单和/或填写表格理由......你需要这些页面的CSRF令牌吗?

+0

是 - 因为它们有助于防止大规模虐待接触形式,论坛等都是伟大的目标,垃圾邮件发送者有这么一个CSRF令牌检查机制是到了好处 – RamRaider

回答

1

CSRF令牌不“绝对需要”(如,表格将没有他们的工作),但他们是一个非常好主意每当从一个网页提交的任何数据,到另一个网页/脚本。 信任有任何数据page 2收到来自page 1(阅读说明如下),是非常小的方式。隔离中的每个页面都不知道用户之前在哪个页面上,甚至可以轻松地由浏览器用户操纵那些旨在暗示此事的内容,如$_SERVER['HTTP_REFERER']

CSRF令牌是页面到页面的关键字,它为接收页面提供了更高级别的信任,该访问者来自预期的发送者页面。部署的属性,他们也可以防止数据重复,这也是一个巨大的奖金,并减少不道德的垃圾邮件和浪费的CPU周期。该CSRF令牌可用于


一个方面:

假设你有一个页面上的表单,该页面被称为page1.php和形式为send contact email,其中表格填写然后发送,它发送到的页面(page2.php)可以构建,然后发送一封联系电子邮件给目标收件人。

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

一个简单的用户将加载您的page1.php,花10分钟写一封措辞谨慎的电子邮件,然后按SEND按钮并提交表单。关闭表单到page2.php,将其详细信息放入发送到[email protected]的电子邮件中。现在

,如果有人从page1.php取得源代码,他们可以使用一个简单的PHP脚本(或任何其他代码)处理发送成百上千的垃圾邮件形式page2.php,他们每个人用正确的信息生成和发送发送电子邮件,这可以用于各种各样的进程,他们可以从许多其他网站,互联网的任何其他部分,甚至从整个僵尸网络发送表单,如果他们选择 - page2.php将被一秒钟的许多请求淹没,电子邮件的收件人将有一个邮箱挤满了无用的表单生成的消息。

输入CSRF令牌

甲CSRF令牌是一个唯一的密钥,其上page1.php保存在表格中,在生成和通常(但不排他地)使用(可能随机地)生成$_SESSION值,以使得当表格被提交,并且$_POST数据被发送到page2.php这是一个相当可靠的检查,表单正在提交从同一个网站。因此,不要让整个僵尸网络向page2.php提交数据并导致很多电子邮件,数据不会被采取行动,而只会从page2.php脚本中运行同一网站提交的页面。

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


上图是保险和过程控制的一种形式,以便你有通过CSRF传递page2.php强烈坚固可靠的数据:

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标题,并在页面被调用时重新提交,所以在PHP中取消设置$_POST数据是毫无意义的。)。


CSRF是一种安全机制, - 当CSRF令牌测试通过 - 意味着你可以可靠地判断数据发送到一个脚本在您的服务器从一个有效的来了,预期的来源。

+0

哇能不造成伤害。非常感谢你花时间写出这种深思熟虑的答案。这是非常赞赏。如果你不介意=)...如果我的表单,即“page1.php”直接进入“PHPMailer”页面而不是“page2.php” '......这是否改变了检查它是从同一个网站提交的事实的需要?顺便说一句,我喜欢你在论坛上愤怒的少年的有趣比喻... =)....但是谁说他们只是青少年?=) – user273072545345

+0

'page2.php'与PHPMailer页面相同,它是一个可以做你想做的任何事情的结果页面,'page2.php'可以是任何页面,做任何事情。它不需要是一个输出HTML页面,只是一个处理由'page1.php'发送给它的数据的页面。在向PHPMailer对象发送任何内容之前,您需要运行'if'语句来检查发送数据的有效性。 – Martin