如何在Cake PHP 1.3中验证非标准操作的POST

时间:2011-10-09 14:50:06

标签: security cakephp components cakephp-1.3

使用CakePHP 1.3

我有一个非标准动作名称的控制器 - 比如说:

class WidgetsController extends AppController {

function modifyColor($id = null) {
// Some code that modifies the background color of a widget 
}

}

和一个配套视图views / widgets / modifyColor.ctp

modifyColor模板POSTS到动作:

echo $this->Form->create('User',array('url' => array('controller' => 'widgets', 'action' => 'modifyColor')));

我在POST上获得了404,因为CakePHP安全组件正在尝试验证表单 我希望能够验证POST。

我能让它工作的唯一方法似乎是关闭POST验证

 if ($this->action == 'modifyColor') {
    $this->Security->validatePost = false;
}

这似乎是一个糟糕的解决方案。

如何在非标准操作中使用安全组件? allowedActions似乎不起作用 谢谢 丹尼

回答我自己的问题。

一个。在CakePHP中使用任何命名的操作没有问题 B. CakePHP的一个概念性错误,与使用Form GET和Form POST相同的函数相关

在表格GET上我有这个:

    if (empty($this->data)) {
          $this->data = $this->Widget->read(null, $id);
    }

表单本身有一些代码:

      echo $this->Form->input('id');
      echo $this->formView('Current color', 'CurrentColor');
      echo $this->formView('New color',     'NewColor');
      echo $this->formView('New background color', 'BackgrdColor');

这很好,除了Widget模型中没有出现这些字段 - 而CakePHP安全组件将此解释为一种XSRF攻击 - 因为它在表单中查找不属于模型的字段。这就是原因:

 $this->Security->validatePost = false;

解决了“问题”。

正确的解决方案就是不要在控制器操作中使用模型填充$ this->数据并处理POST上的字段分配:

function modcolor () {
    $this->layout = 'app_ui_listview';
    if (!empty($this->data)) {
          $id = $this->Session->read('Auth.User.id');
          $u = $this->Widget->read(null, $id);
                 // Assign fields from the form to the model....


    }
}

1 个答案:

答案 0 :(得分:0)

问题是你正在尝试传递url,而你也试图传递控制器的东西。

echo $this->Form->create('Widget', array('controller' => 'widgets', 'action' => 'modifyColor'));

echo $this->Form->create('Widget', array('url' => '/widgets/modifyColor'));