Symfony2 - 在 CRUD 操作中使用删除表单
Symfony2 - use of Delete form in CRUD operation
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()
;
}
我的问题是为什么我们需要一个表格来删除?我们不能在树枝中有一个 link 并相应地设置 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');
}
如果您使用link删除id,机器人可能会循环删除您的数据。
在 Symfony 操作中检查 "DELETE" 方法以及您的 crsf 令牌是否使用方法 isValid "$form->isValid()"
这是创建表单并验证的安全原因
不使用简单的 link 删除数据表示 HTTP 中 safe methods 的概念(如果您只有一个简单的 link,则必须发送 GET
请求到 URL):
Some of the methods (for example, HEAD, GET, OPTIONS and TRACE) are, by convention, defined as safe, which means they are intended only for information retrieval and should not change the state of the server. In other words, they should not have side effects [...]
我觉得写一个关于CSRF的词很重要。
通过使用 Symfony 表单,它创建了一个 CSRF 令牌,以确保删除该实体的用户与想要它的用户相同。
如果没有表单,只有 link /{id}
,则可以通过在邮件中使用错误的 link 或 XSS 攻击,让其他人发送删除请求一个实体。
如果 Bob 使用 XSS 漏洞或其他方式使 Alice(管理员)发送删除实体的请求,则该请求由 Alice 发送,如果是来自 Bob 的攻击。因此,Bob 没有该请求的权限,但他使用了具有权限的 Alice 的会话。实体已删除。
为了防止 CSRF 攻击,使用 CSRF 令牌非常重要。 Symfony 的表单自动包含它,并检查是否在 isValid()
.
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()
;
}
我的问题是为什么我们需要一个表格来删除?我们不能在树枝中有一个 link 并相应地设置 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');
}
如果您使用link删除id,机器人可能会循环删除您的数据。
在 Symfony 操作中检查 "DELETE" 方法以及您的 crsf 令牌是否使用方法 isValid "$form->isValid()"
这是创建表单并验证的安全原因
不使用简单的 link 删除数据表示 HTTP 中 safe methods 的概念(如果您只有一个简单的 link,则必须发送 GET
请求到 URL):
Some of the methods (for example, HEAD, GET, OPTIONS and TRACE) are, by convention, defined as safe, which means they are intended only for information retrieval and should not change the state of the server. In other words, they should not have side effects [...]
我觉得写一个关于CSRF的词很重要。
通过使用 Symfony 表单,它创建了一个 CSRF 令牌,以确保删除该实体的用户与想要它的用户相同。
如果没有表单,只有 link /{id}
,则可以通过在邮件中使用错误的 link 或 XSS 攻击,让其他人发送删除请求一个实体。
如果 Bob 使用 XSS 漏洞或其他方式使 Alice(管理员)发送删除实体的请求,则该请求由 Alice 发送,如果是来自 Bob 的攻击。因此,Bob 没有该请求的权限,但他使用了具有权限的 Alice 的会话。实体已删除。
为了防止 CSRF 攻击,使用 CSRF 令牌非常重要。 Symfony 的表单自动包含它,并检查是否在 isValid()
.