在链接上使用CSRF令牌

问题描述:

我对链接上使用CSRF令牌有疑问。在我的情况下,我想用CSRF令牌来保护我的删除链接。我已经找到了如何做到这一点:在链接上使用CSRF令牌

在我看来,我用小树枝csrf_token()函数(http://symfony.com/doc/current/reference/twig_reference.html#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()方法(http://symfony.com/doc/current/controller/csrf_token_validation.html):

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标记。

这是好方法,还是应该对所有类的删除链接使用相同的标记?使用token_id:deleteTube for Tube,deleteComment for Comment等?我认为每个链接都有一个不同的标记会更好,但也许是开销?

非常感谢您的帮助。

PS:对不起,我的英语... :-(

+0

我认为形式使用的Symfony的主要CSRF令牌,每个项目只有一个,那么为什么你也只能在每个链接中只使用一个呢? –

+0

例如,如果我在我的表单上使用Tube,在添加的表单上我总是使用相同的标记(对于会话),如果我编辑一个管道,它与添加表单相同,对于所有编辑过的管道来说都是一样的,在我的删除链接中调用一个控制器操作时也是如此,我使用2按钮创建一个窗体(Confirm d elete,Cancel)通过表单和确认获得CSRF保护。在这种情况下,我对使用此方法的所有删除链接都有同样的道理,因为symfony在会话中创建了_csrf/form令牌并重用它。 – mpiot

+1

CSRF(跨站点请求伪造)旨在防止恶意网站通过用户的身份验证会话进行操作.IMHO完全足以让您的所有链接都拥有一个令牌,因为更多的令牌不会增强安全性...... –

可以渲染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() 
    ; 
}