通过symfony中产生的渣滓adutomatic操作,还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
参数的链接,不能只是我们下面的,为什么我们需要检查,如果表单里面的实体delete一个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');
}
如果您使用的链接,与ID删除,这是可能的机器人可以删除你的数据循环。
在Symfony的行动检查“删除”的方法,以及如果你的CSRF令牌方法IsValid验证“$形式 - > isValid()的”
这是安全原因,它的创建形式和验证
不使用简单的链接删除数据表示要safe methods的HTTP概念(如果你有只是一个简单的链接,你就必须发送一个GET
请求URL):
一些方法(例如,HEAD,GET,OPTIONS和TRACE)是,按照惯例,被定义为安全的,这意味着它们仅用于信息检索和不应该改变的服务器的状态。换句话说,他们不应该有副作用[...]
我觉得写一个关于CSRF字是很重要的。
通过使用Symfony的形式,它会创建一个CSRF令牌,以确保谁删除该实体的用户是谁想要它相同的用户。如果没有形式,只有一个链接/{id}
,它会使用错误的链接在邮件或XSS攻击,使别人发送给删除实体的要求是不可能的。
如果Bob使用一个XSS漏洞或别的东西,使爱丽丝(管理员)发送删除一个实体的请求,该请求被Alice发送,如果事件是由鲍勃攻击。所以,鲍勃还没有这个要求的权利,但他用爱丽丝,谁拥有权利的会议。该实体将被删除。
为了防止CSRF攻击,使用CSRF令牌是非常重要的。 Symfony的的形式自动将它包括,在isValid()
检查。