【发布时间】:2017-06-20 10:58:09
【问题描述】:
我有一个关于在链接上使用 CSRF 令牌的问题。就我而言,我想用 CSRF 令牌保护我的删除链接。我已经找到了方法:
在我的模板中,我使用 Twig 的 csrf_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-1,deleteTube-2,...)带有令牌 ID 中的对象 ID。然后,在我的会话中,我创建了很多 CSRF 令牌。
这是一个好方法,还是我应该对一个类的所有删除链接使用相同的标记?使用令牌 ID,例如:deleteTube 代表 Tube,deleteComment 代表 Comment,等等?我认为最好为每个链接使用不同的令牌,但也许这是开销?
【问题讨论】:
-
我认为 Symfony 在表单中使用的主要 csrf 令牌,每个项目只有一个。那么,为什么每个链接也只使用一个对您来说是个坏主意呢?
-
例如,如果我使用我的表单 Tube,在添加表单上我总是使用相同的标记(对于会话),如果我编辑一个 Tube,它与添加表单的标记相同,对于所有编辑过的管子都是一样的。在调用控制器操作的删除链接上也是如此,在该操作中,我创建了一个带有 2 个按钮(确认删除、取消)的表单,以对表单和确认进行 CSRF 保护。在这种情况下,我对所有使用此方法的删除链接都有相同的令牌,因为 symfony 在会话中创建了一个 _csrf/form 令牌并重用它。
-
CSRF(跨站点请求伪造)的目的是防止恶意网站通过用户的身份验证会话进行操作。恕我直言,为所有链接拥有一个令牌就足够了,因为赢得了更多令牌'不增强安全性...
-
@HonzaRydrych:我同意你,这就是我问这个问题的原因,因为也许一个令牌足以保护链接。这就是为什么我建议每个对象一个可能太多了。我等待其他答案:) 非常感谢。
标签: php symfony hyperlink csrf websecurity