【问题标题】:Form action and antiCSRF token表单动作和 antiCSRF 令牌
【发布时间】:2014-09-02 21:44:23
【问题描述】:

我有点困惑。

首先,REGISTRATION 表单是否需要 antiCSRF 令牌?还是我们只将它用于 LOGIN 表单?

如果注册表格也需要它,那么我有以下问题:

我有 index.php 脚本,其中我有一个表单,然后在将它们插入数据库之前进行某种数据验证。

是这样的:

<html>
.....
<body>
  <?php

     if(!empty($_POST))
     {
       //perform all kind of data validation

       //when all validation is done i need to move to the next page (**main.php**)

       header('Location:main.php');

      }

  <form method="POST" action="">
  <input type="hidden" name="hashed_token" value="<?php echo antiCSRFToken(); ?>" />

          //all kind of input (username, email, password,...)

  </form>

antiCSRFToken() 是一个生成随机哈希的函数。

为了防止可能的 CSRF 攻击,我需要将生成的哈希“保存”在 SESSION 变量中 {$_SESSION['hashed_token'] = $_POST['hashed_token']}然后将其与隐藏表单输入字段中的哈希值进行比较,之后我们重定向到ma​​in.php

但是由于表单输入保留在同一个脚本 (action="") [为了执行验证脚本] 我该怎么做?我无法将 $_POST['hashed_token'] 发送到 main.php。

是否可以在 index.php 和 main.php 之间的脚本上执行验证?让我们说 between.php 并在验证完成后立即重定向到 main.php? [索引.php |之间.php | main.php]

提前致谢。

【问题讨论】:

  • 我对这个问题感到困惑。您将令牌放入表单并在发布时对其进行验证。有什么问题?
  • 对令牌的建议是将$_SESSION['hashed_token'] 作为一个数组,因为它只会接受打开的最后一个创建令牌/每次覆盖令牌的页面。
  • 我还会使用哈希作为字段名称。可以搜索“hashed_token”并发现值。 “随机字符串”隐藏得更好一点。然后你会有一个会话变量告诉你字段名和期望值。

标签: php forms validation


【解决方案1】:

一般来说,注册和登录表单都不需要 CSRF 保护。他们都不会对登录用户的个人数据或权限做任何事情。也就是说,没有真正的理由拥有 CSRF 保护,因为您可以编写一个通用系统并将其应用于网站上的每个表单(除非您明确不想要 CSRF 保护,例如搜索表格)。

为了防止可能的 CSRF 攻击,我需要将生成的哈希“保存”在 SESSION 变量 {$_SESSION['hashed_token'] = $_POST['hashed_token']} 中,然后将其与哈希值进行比较在隐藏的表单输入字段中,

这都是明智的

在我们重定向到 main.php 之后。

不要那样做。将代码放在通用函数中进行比较。将其包含在所有表单处理页面中,并在您处理表单时运行它。

【讨论】:

  • 那么,我可以生成一个哈希值并在同一个脚本中进行比较?
  • 当然。这是一个不同的请求,您正在比较来自用户的数据,而不是您刚刚在同一程序的同一运行中创建的数据
  • 好的!所以在第一个请求中我生成它并将其保存在表单中,然后在第二个请求中进行比较?
  • 此外,搜索表单不应使用POST
  • @christostsang — 是的,尽管最好将它们视为“请求表单”和“请求表单数据”。
猜你喜欢
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2013-11-20
  • 2011-01-03
  • 2013-08-08
  • 2016-12-03
  • 2018-01-05
相关资源
最近更新 更多