Symfony2 - 在CRUD操作中使用Delete表单

时间:2016-01-05 06:26:51

标签: php symfony symfony-forms symfony-2.8

symfony生成的自动crud操作以及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');
    }

3 个答案:

答案 0 :(得分:9)

如果您使用带有id的删除链接,机器人可以通过循环删除您的数据。

在Symfony操作中检查“DELETE”方法以及crsf令牌是否使用方法验证isValid“$ form-> isValid()”

这是安全原因,它创建表单并验证

答案 1 :(得分:5)

不使用简单的链接删除数据表示HTTP中safe methods的概念(如果您只有一个简单的链接,则必须向URL发送GET请求):< / p>

  

按照惯例,某些方法(例如,HEAD,GET,OPTIONS和TRACE)被定义为安全,这意味着它们仅用于信息检索,不应更改服务器的状态。换句话说,它们不应该有副作用[...]

答案 2 :(得分:0)

我认为写关于CSRF的文字很重要。

通过使用Symfony表单,它将创建CSRF令牌,以确保删除实体的用户与想要该实体的用户相同。 如果没有表单,而只有链接/{id},则可以通过使用邮件中的错误链接或XSS攻击,使其他人发送删除实体的请求。

如果Bob使用XSS违规行为或其他方式使Alice(管理员)发送删除实体的请求,则该请求由Alice发送,如果是Bob发起的攻击。因此,Bob没有此请求的权利,但是他使用了拥有权利的Alice的会话。该实体已删除。

为了防御CSRF攻击,使用CSRF令牌非常重要。 Symfony的表单会自动包含它,并检查是否在isValid()中。