2017-02-03 12 views
0

У меня вопрос об использовании токена 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). Затем, в моей сессии, у меня появилось много токенов csrf.

Это хороший метод, или я должен использовать тот же токен для всех ссылок на удаление для класса? С token_id вроде: deleteTube для Tube, deleteComment для комментариев и т. Д.? Я думаю, что лучше иметь другой токен для каждой ссылки, но, может быть, это накладные расходы?

Большое спасибо за помощь.

PS: Извините за мой английский ... :-(

+0

Я думаю, что главный маркер CSRF в Symfony используется в формах , только для каждого проекта. Так почему же плохой идеей для вас использовать только одну для всех ссылок? –

+0

Например, если я иду по моей форме Tube, в форме добавления у меня всегда один и тот же токен (для сеанс), если я отредактирую трубку, это тот же знак, что и форма добавления, и то же самое для всех отредактированных труб. То же самое на моих ссылках удаления, которые вызывают действие контроллера, в котором я создаю форму с помощью кнопки 2 (Confirm d elete, Cancel), чтобы иметь CSRF-защиту с формой и подтверждением. В этом случае у меня есть тот же токен для всех ссылок на удаление, которые используют этот метод, потому что symfony создает токен _csrf/form в сеансе и повторно использует его. – mpiot

+1

Цель CSRF (Cross-Site Request Forgery) заключается в том, чтобы предотвратить вредоносное веб-сайт для выполнения действий через аутентифицированный сеанс пользователя. IMHO вполне достаточно, чтобы иметь один токен для всех ваших ссылок, потому что больше токенов не улучшит безопасность ... –

ответ

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() 
    ; 
} 
Смежные вопросы