将表单提交到CakePHP 2.6中的不同操作会导致黑洞

时间:2015-07-27 19:05:52

标签: php forms cakephp

我的CakePHP 2.6应用程序中有一个表单,它有多个按钮可以将表单提交给不同的操作。使用Cake 2.4,这很有效,但在2.6提交到默认表单操作以外的任何内容时会导致出现黑洞'auth'错误。

在我的表单结束之前,我有多个提交按钮,如下所示:

echo $this->Form->button('Default', array(
    'type' => 'submit',
));
echo $this->Form->button('Alternate 1', array(
    'type' => 'submit',
    'formaction' => '/posts/otheraction',
)); 
echo $this->Form->button('Alernate 2', array(
    'type' => 'submit',
    'formaction' => '/posts/anotheraction',
)); 

Reading the docs,我看到‘auth’ Indicates a form validation error, or a controller/action mismatch error.。然而,这在过去有效 - 似乎事情变得更加严格。如何在不完全关闭安全性的情况下让Cake接受其他操作提交的表单?

2 个答案:

答案 0 :(得分:1)

这似乎是不可能的(至少不是没有跳过极大的箍),因为行动无条件地被合并到令牌中。

$hashParts = array(
    $this->_lastAction, // <<<<<<<<<<<
    serialize($fields),
    $unlocked,
    Configure::read('Security.salt')
);
$fields = Security::hash(implode('', $hashParts), 'sha1');

<强> https://github.com/cakephp/cakephp/blob/2.7.1/lib/Cake/View/Helper/FormHelper.php#L589

同样禁用此行为可能会削弱安全性,因为发布数据未被用于的操作可能会导致意外行为。

您可以通过单个操作处理此问题,例如,通过为各个提交按钮提供名称和值,并在控制器操作中评估值并执行任何需要执行的操作

echo $this->Form->button('Default', array(
    'type' => 'submit',
    'name' => 'action',
    'value' => 'default'
));
echo $this->Form->button('Alternate 1', array(
    'type' => 'submit',
    'name' => 'action',
    'value' => 'alternate1'
)); 
echo $this->Form->button('Alernate 2', array(
    'type' => 'submit',
    'name' => 'action',
    'value' => 'alternate2'
));
switch ($this->request->data('action')) {
    case 'default':
        // ...
        break;

    case 'alternate1':
        // ...
        break;

    case 'alternate2':
        // ...
        break;
}

答案 1 :(得分:0)

我使用 jQuery 来改变表单的动作

HTML 按钮:

<button id='saveSubmitter'>Save</button>

javascript:

$('body').on('click', '#saveSubmitter',
  function(e){
      e.preventDefault()
      $('form').attr('action', '<?php echo Router::url( array("action"=>"save")); ?>')
      $('form').submit()
  }
)