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');
}
答案 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()
中。