使用 CakePHP 2.3。我打开了安全组件,我注意到 postLinks 的一个奇怪行为,由于某种原因,它们似乎不再通过 POST 传输数据,而是使用 GET。在我试图调用的操作中,我做的第一件事是确保数据是由 POST 生成的:
if (!$this->request->is('post'))
{
throw new MethodNotAllowedException();
}
当安全组件打开时,此 if 语句为假。当它关闭时,if 语句为真。没有进行其他更改。
帖子链接:
<?php echo $this->Form->postLink($this->Html->image('icons/resend-icon.png'), array('action' => 'resend', $invoice['Invoice']['number']), array('escape' => false, 'class' => 'hastip', 'title' => 'Resend'), __('Are you sure you want to resend this invoice?')); ?>
据我所知,我没有找到任何解释。如果我可以确保数据实际上是通过 POST 发送的,我会更喜欢,尽管如果我删除对请求的检查是 POST,其他一切都会正常工作。
编辑:我发现如果我设置 $this->Security->csrfCheck = false; 和 $this->Security->validatePost = false; 在该特定操作的之前过滤器中,它没有这个问题。我仍然想知道为什么会这样。
编辑2:
经过更多调查,我发现有问题的页面视图上有另一个表单,它echo $this->Form->create('Invoice', array('type' => 'get'));
不应该以任何方式影响帖子链接(帖子链接不在表单内,等等),但如果我删除array('type' => 'get')
, postLinks 开始工作。我需要另一个表单是 get 类型,因为它是一个搜索表单,并且我需要在 URL 中包含搜索查询字符串。
编辑3:
我发现将搜索表单移到帖子链接下方也可以解决问题。我尝试通过 html 验证器运行标记以确保没有任何格式错误,但它没有报告任何内容。
编辑4:
我发现为 PostLinks 生成的标记是不正确的——用于检测 CSRF 的隐藏输入命名不正确,导致 CSRF 测试失败。因此,请求被黑洞。我已经设置了一个黑洞回调来将 http:// 重定向到 https://,因此页面被重定向,从而导致对同一页面的新 get 请求,然后被 MethodNotAllowedException 拒绝。现在试图调查为什么没有正确生成 PostLinks。