Concrete5表单令牌验证

时间:2014-01-30 10:29:22

标签: forms token concrete5

我有以下表格:

<form method="post" action="<?php echo $this->action('delete');?>">
<?php
    $token = Loader::helper('validation/token');
    $token->output('delete_event');
    echo $form->hidden('id', $row['bID']);
    echo $form->submit(null, t('Delete'), array('class' => 'delete', 'onclick' => 'return false'));
?>
</form>

和控制器方法:

public function action_delete() {
    if($this->authenticate() && $this->isAdmin()){
        $id = (int) $_POST['id'];

        $val = Loader::helper('validation/form');
        $val->addRequiredToken('delete_event');

        if($val->test() == 0){
            //delete from DB
        }
    }
}

但由于某种原因,令牌未经过验证。任何见解?

3 个答案:

答案 0 :(得分:1)

我认为这是因为您使用Block控制器方法验证令牌。这应该已经受到可能导致冲突的令牌的保护。

如果你确实想要继续检查它,你可能会这样做

$token = Loader::helper('validation/token');
$form->hidden('delete_event_token', $token->generate('delete_event'));

然后在controller.php中

if (Loader::helper('validation/token')->validate('delete_event', $this->post('delete_event_token'))) {
  // do db stuff
}

也就是说,在阻止操作中,CSRF令牌已经为您处理,因此您无需进行检查。

答案 1 :(得分:1)

API文档不正确。

你应该像Jake的例子一样用if ($val->test()) {}进行测试。将它与0进行比较基本上是说== false(false和0都是假的),如果你查看代码,它会根据成功或失败返回true或false:

return count($this->fieldsInvalid) == 0;

https://github.com/concrete5/concrete5/blob/master/web/concrete/core/helpers/validation/form.php#L217

虽然现在我也读过mkly的帖子,但他也是对的。您无需在阻止操作中检查令牌。但是,重要的是要记住正确的$val->test()用法。

詹姆斯

答案 2 :(得分:0)

为什么要测试0(零)?

请记住,零和假是不一样的。尝试更改为

public function action_delete() {
    if($this->authenticate() && $this->isAdmin()){
        $id = (int) $_POST['id'];

        $val = Loader::helper('validation/form');
        $val->addRequiredToken('delete_event');

        if($val->test()){
            //this authenticated
        }
        else{
            //this did not authenticate
        }
    }
}