0

使用 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。

4

1 回答 1

0

我确定解决方案是在完成第一个表单后,我需要重置表单助手的请求类型。

<?php echo $this->Form->create('Invoice', array('type' => 'get')); ?>
<?php echo $this->Form->end(); ?>
<?php $this->Form->requestType = null; ?>

$this->Form->requestType 以 null 开始,并通过调用 $this->Form->create 来设置。因此,如果我将较早的表单设置为发布,或者如果我在使用 postLinks 后创建了表单,则表单助手的请求类型设置为在我尝试创建 postLinks 时将与 PostLinks 一起使用的值,但它似乎手动重置requestType 也可以。

编辑:这实际上是 CakePHP 框架的一个错误。我已经报告了,并且已经修复,所以在最新版本的 CakePHP 中不再需要了。

于 2013-11-12T00:14:50.533 回答