安全组件和PostLinks

时间:2013-11-11 17:44:00

标签: cakephp cakephp-2.3

使用CakePHP 2.3。我打开了安全组件,我注意到postLinks的奇怪行为,由于某些原因,他们似乎不再通过POST传输数据,而是使用GET。在我试图调用的操作中,我要做的第一件事就是确保数据是通过POST制作的:

if (!$this->request->is('post')) 
{
     throw new MethodNotAllowedException();
}

安全组件打开时,此if语句为false。关闭时,if语句为true。没有进行任何其他更改。

postLink:

<?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-&gt; Security-&gt; csrfCheck = false;和$ this-&gt; Security-&gt; validatePost = false;在该特定操作的前过滤器中,它没有此问题。我仍然想知道为什么会这样。

编辑2:

经过更多调查,我发现有问题的页面的视图上有另一个表单,echo $this->Form->create('Invoice', array('type' => 'get'));不应该以任何方式影响帖子链接(帖子链接不在表单内等) ,但如果删除array('type' => 'get'),则postLinks开始工作。我需要另一种形式为get get,因为它是一个搜索表单,我需要在URL中有搜索查询字符串。

编辑3:

我发现在帖子链接下方移动搜索表单也可以解决问题。我尝试通过html验证器运行标记,以确保没有任何格式错误,但它没有报告任何内容。

编辑4:

我发现为PostLinks生成的标记不正确 - 用于检测CSRF的隐藏输入命名不正确,导致它无法进行CSRF测试。因此,请求变得黑暗。我已经设置了一个blackhole回调来将http://重定向到https://,因此页面被重定向,导致对同一页面的新get请求,然后被MethodNotAllowedException拒绝。试着调查为什么没有正确生成PostLinks。

1 个答案:

答案 0 :(得分:0)

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

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

$ this-&gt; Form-&gt; requestType以null开头,并通过调用$ this-&gt; Form-&gt; create来设置。因此,如果我将早期的Form设置为post,或者如果我在使用postLinks之后创建了Form,则Form helper的请求类型将设置为当我尝试创建postLinks时将与PostLinks一起使用的值,但它会显示为手动重置requestType也可以。

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