2

我有一个关于在链接上使用 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-1对象deleteTube-2id 在令牌 id 中。然后,在我的会话中,我创建了很多 CSRF 令牌。

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

4

2 回答 2

0

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

来自OWASP - CSRF

跨站点请求伪造 (CSRF) 是一种攻击,它强制最终用户在当前已通过身份验证的 Web 应用程序上执行不需要的操作。


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

于 2020-09-17T12:48:11.110 回答
0

您可以为每个链接呈现 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()
    ;
}
于 2017-02-04T20:09:16.457 回答