使用CakePHP发送POST请求时出现安全问题

时间:2013-08-23 19:56:05

标签: php jquery ajax cakephp

我有使用jQuery将POST数据发送到我的控制器的视图,但它失败了,我收到以下错误:

The request has been black-holed 
The requested address'/settings/submit_bank_info' was not found on this server.

我能让它工作的唯一方法是将所有控制器中的安全性一起移除。

这是有问题的控制器的前置过滤器

 public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('help','submit_bank_info');
    $this->Auth->authorize = 'Controller';
}

如果在蛋糕的文档上看到这个

  

使用安全组件时,必须使用FormHelper   创建表单。此外,您不能覆盖任何   fields的“name”属性。安全组件寻找确定的   由FormHelper创建和管理的指标(尤其是   在create()和end()中创建的那些。动态改变字段   在POST请求中提交的内容(例如禁用,删除或   通过JavaScript创建新字段可能会触发一个   黑洞请求。请参阅$ validatePost或$ disabledFields   配置参数。

我正在使用2.3.8版。有没有什么方法可以为该操作禁用它,以便我可以保留其他操作的安全组件?

1 个答案:

答案 0 :(得分:2)

尝试停止jQuery并发布表单并使用firebug跟踪CakePHP与表单一起发送的隐藏数据,因为他们的文档会发送隐藏数据以防止CSRF攻击。

  

csrfExpires属性可以是与之兼容的任何值   的strtotime()。默认情况下,FormHelper将添加数据[_Token] [key]   在启用组件时,将CSRF令牌包含在每个表单中。

尝试捕获隐藏的字段并将其与jquery请求一起发送。

<强>更新

还尝试使用CakePHP生成表单,它将使用键生成数据[_Token] [fields]和data [_Token] [unlocked]隐藏字段:

<?php 
    echo $this->Form->create('formA',array('id'=>'formA'));
    echo $this->Form->input('inputA');
    echo $this->Form->submit();
    echo $this->Form->end();
?> 

这将生成

    <input type="hidden" name="_method" value="POST"/>
    <input type="hidden" name="data[_Token][key]" value="randomValue"/>
    <input type="hidden" name="data[_Token][fields]" value="randomValue"/>
    <input type="hidden" name="data[_Token][unlocked]" value=""/>

在你的JQuery ajax请求serialize()表单并发送它。