【问题标题】:Use CSRF token on link在链接上使用 CSRF 令牌
【发布时间】:2017-06-20 10:58:09
【问题描述】:

我有一个关于在链接上使用 CSRF 令牌的问题。就我而言,我想用 CSRF 令牌保护我的删除链接。我已经找到了方法:

在我的模板中,我使用 Twigcsrf_token() 函数:

<a class="btn btn-danger" value="Delete" href="{{ path('tube_delete', { 'id': tube.id, 'token': csrf_token('deleteTube-' ~ tube.id) }) }}">
    <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
</a>

在我的控制器中,isCsrfTokenValid() 方法:

if (!$this->isCsrfTokenValid('deleteTube-'.$tube->getId(), $request->get('token'))) {
    $this->addFlash('warning', 'The token is not valid !');
}

所有这些工作都很好,但我有一个关于 CSRF 令牌的一般性问题,如您所见,我为每个删除链接使用不同的令牌(例如:deleteTube-1deleteTube-2,...)带有令牌 ID 中的对象 ID。然后,在我的会话中,我创建了很多 CSRF 令牌。

这是一个好方法,还是我应该对一个类的所有删除链接使用相同的标记?使用令牌 ID,例如:deleteTube 代表 TubedeleteComment 代表 Comment,等等?我认为最好为每个链接使用不同的令牌,但也许这是开销?

【问题讨论】:

  • 我认为 Symfony 在表单中使用的主要 csrf 令牌,每个项目只有一个。那么,为什么每个链接也只使用一个对您来说是个坏主意呢?
  • 例如,如果我使用我的表单 Tube,在添加表单上我总是使用相同的标记(对于会话),如果我编辑一个 Tube,它与添加表单的标记相同,对于所有编辑过的管子都是一样的。在调用控制器操作的删除链接上也是如此,在该操作中,我创建了一个带有 2 个按钮(确认删除、取消)的表单,以对表单和确认进行 CSRF 保护。在这种情况下,我对所有使用此方法的删除链接都有相同的令牌,因为 symfony 在会话中创建了一个 _csrf/form 令牌并重用它。
  • CSRF(跨站点请求伪造)的目的是防止恶意网站通过用户的身份验证会话进行操作。恕我直言,为所有链接拥有一个令牌就足够了,因为赢得了更多令牌'不增强安全性...
  • @HonzaRydrych:我同意你,这就是我问这个问题的原因,因为也许一个令牌足以保护链接。这就是为什么我建议每个对象一个可能太多了。我等待其他答案:) 非常感谢。

标签: php symfony hyperlink csrf websecurity


【解决方案1】:

您可以为每个链接呈现 JavaScript 确认框。在您的控制器中:

private function createDeleteForm(Article $article)
{
    return $this->createFormBuilder()
        ->setAction($this->generateUrl('news_delete', array('id' => $article->getId())))
        ->setMethod('DELETE')
        ->add(
            'submit',
            'Symfony\Component\Form\Extension\Core\Type\SubmitType',
            ['label'=>'Delete', 'attr' => ['onclick'=>'return confirm("Are you sure?")', 'class' => 'btn btn-danger']]
        )
        ->getForm()
    ;
}

【讨论】:

    【解决方案2】:

    CSRF 保护是为了保证用户自愿做出一个动作。 您不需要为每个对象生成 1 个令牌,因为 CSRF 保护的目的不是区分您的对象,每个操作一个令牌是可以的。

    来自OWASP - CSRF

    Cross-Site Request Forgery (CSRF) 是一种攻击,它会强制最终用户在当前已通过身份验证的 Web 应用程序上执行不需要的操作。


    关于 Symfony
    如果您为所有链接生成单个令牌,它们具有相同的令牌值,它不会在每次 csrf_token() 调用时更改。
    此外,根据您的应用程序及其功能,您还需要通过role(例如用户是管理员,他可以删除所有cmets)或voter(例如用户如果他是作者,可以删除评论)。

    【讨论】:

      猜你喜欢
      • 2012-08-11
      • 2012-05-29
      • 2012-05-28
      • 1970-01-01
      • 2021-07-28
      • 2018-06-05
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多