Операция Adutomatic Crud, сгенерированная Symfony, а также демонстрационное приложение Symfony, имеет следующую структуру кода для действия удаления.
/**
* Deletes a testing entity.
*
* @Route("/{id}", name="testing_delete")
* @Method("DELETE")
*/
public function deleteAction(Request $request, testing $testing)
{
$form = $this->createDeleteForm($testing);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->remove($testing);
$em->flush();
}
return $this->redirectToRoute('testing_index');
}
/**
* Creates a form to delete a testing entity.
*
* @param testing $testing The testing entity
*
* @return \Symfony\Component\Form\Form The form
*/
private function createDeleteForm(testing $testing)
{
return $this->createFormBuilder()
->setAction($this->generateUrl('testing_delete', array('id' => $testing->getId())))
->setMethod('DELETE')
->getForm()
;
}
мой вопрос: зачем нам форму для удаления? не может у нас просто есть ссылка в ветке с id
соответственно, мы не можем просто сделать следующее, зачем нам проверять, есть ли isValid()
внутри формы перед ее удалением?
/**
* test delete
* @Route("/{id}", name="testing_delete")
* @Method("DELETE")
*/
public function deleteAction(testing $testing) {
$em = $this->getDoctrine()->getManager();
$em->remove($testing);
$em->flush();
return $this->redirectToRoute('testing_showall');
}
Если вы использовали ссылку для удаления с идентификатором, возможно, робот сможет удалить ваши данные с помощью цикла.
В действии Symfony проверьте метод «DELETE», а также проверьте, проверяет ли ваш токен crsf метод isValid «$ form-> isValid ()»
Это причина безопасности, это создать форму и проверить
Отсутствие простой ссылки для удаления данных означает концепцию безопасные методы в HTTP (если бы у вас была простая ссылка, вы должны были бы отправить GET
запрос к URL):
Некоторые из методов (например, HEAD, GET, OPTIONS и TRACE) по соглашению определены как безопасные, что означает, что они предназначены только для поиска информации и не должны изменять состояние сервера. Другими словами, они не должны иметь побочных эффектов […]
Я думаю, что важно написать слово о CSRF.
Используя форму Symfony, он создает маркер CSRF, который гарантирует, что пользователь, удаляющий объект, будет тем же пользователем, который его хотел.
Если бы не было формы и только ссылка /{id}
можно было бы использовать плохую ссылку в почте или атаку XSS, чтобы кто-то еще отправил запрос на удаление сущности.
Если Боб использует нарушение XSS или что-то еще, чтобы Алиса (администратор) отправила запрос на удаление сущности, запрос отправляется Алисой, если это атака Боба. Итак, у Боба нет прав на этот запрос, но он использовал сеанс Алисы, у которой есть права. Сущность удалена.
Для защиты от CSRF-атак очень важно использовать токен CSRF. Форма Symfony включает его автоматически, и проверьте, если в isValid()
,