Symfony2 - использование формы Удалить в операции CRUD

автоматическая операция 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');
    }

person pinch boi triggered af    schedule 05.01.2016    source источник


Ответы (3)


Если вы использовали ссылку для удаления с идентификатором, робот может удалить ваши данные с помощью цикла.

В действии Symfony проверьте метод "DELETE", а также проверьте, проверяется ли ваш токен crsf с помощью метода isValid "$form->isValid()"

Это причина безопасности, она создает форму и проверяет

person Ashok Chitroda    schedule 05.01.2016
comment
ах да, отлично, есть ли какие-нибудь документы в Интернете, в которых говорится об этом? - person pinch boi triggered af; 05.01.2016
comment
Я не знаю о документах, я дал ответ в соответствии с моими знаниями. Если я найду документ, поделитесь с вами .. спасибо - person Ashok Chitroda; 05.01.2016
comment
эта ссылка говорит о защите csrf из документа Symfony symfony.com/doc /current/components/form.html#csrf-protection - person medunes; 13.05.2017

Неиспользование простой ссылки для удаления данных указывает на концепцию безопасных методов в HTTP (если у вас была простая ссылка, вам нужно было отправить GET запрос на URL):

Некоторые из методов (например, HEAD, GET, OPTIONS и TRACE) условно определены как безопасные, а значит, предназначены только для получения информации и не должны изменять состояние сервера. Другими словами, они не должны иметь побочных [...]

person xabbuh    schedule 05.01.2016

Я думаю, важно написать пару слов о CSRF.

Используя форму Symfony, он создает токен CSRF, который гарантирует, что пользователь, удаляющий объект, является тем же пользователем, который этого хотел. Если бы не было формы и была бы только ссылка /{id}, можно было бы с помощью плохой ссылки в почте или XSS-атаки заставить кого-то другого отправить запрос на удаление объекта.

Если Боб использует нарушение XSS или что-то еще, чтобы заставить Алису (администратора) отправить запрос на удаление объекта, запрос отправляется Алисой, даже если это атака со стороны Боба. Итак, у Боба нет прав на этот запрос, но он использовал сеанс Алисы, у которой есть права. Сущность удалена.

Для защиты от атак CSRF очень важно использовать токен CSRF. Форма Symfony включает его автоматически, и проверьте, есть ли в isValid().

person AnthonyB    schedule 09.01.2019