我有使用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版。有没有什么方法可以为该操作禁用它,以便我可以保留其他操作的安全组件?
答案 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()
表单并发送它。