0

我有使用 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 来创建表单。此外,您不得覆盖任何字段的“名称”属性。安全组件查找由 FormHelper 创建和管理的某些指标(尤其是在 create() 和 end() 中创建的指标)。动态更改在 POST 请求中提交的字段(例如,通过 JavaScript 禁用、删除或创建新字段)可能会触发请求的黑洞。请参阅 $validatePost 或 $disabledFields 配置参数。

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

4

1 回答 1

2

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

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

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

更新

还尝试使用 CakePHP 生成表单,它将生成 data[_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()表单并发送它。

于 2013-08-24T07:03:26.087 回答