首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Concrete5表单令牌验证

Concrete5表单令牌验证
EN

Stack Overflow用户
提问于 2014-01-30 10:29:21
回答 3查看 877关注 0票数 0

我有以下表格:

代码语言:javascript
运行
复制
<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>

而控制器方法:

代码语言:javascript
运行
复制
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
        }
    }
}

但由于某些原因,令牌没有得到验证。有什么见解吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-14 00:37:22

API文档不正确。

您应该使用if ($val->test()) {}进行测试,如杰克的示例所示。将其与0进行比较本质上是说== false (false和0都是falsey),如果您查看代码,它将根据成功或失败返回真或假:

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

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

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

詹姆斯

票数 1
EN

Stack Overflow用户

发布于 2014-01-31 00:41:59

我认为这是因为您正在使用块控制器方法验证令牌。应该已经用可能引起冲突的令牌来保护这一点。

如果你真的想继续检查它,你也许能做到。

代码语言:javascript
运行
复制
$token = Loader::helper('validation/token');
$form->hidden('delete_event_token', $token->generate('delete_event'));

然后在controller.php

代码语言:javascript
运行
复制
if (Loader::helper('validation/token')->validate('delete_event', $this->post('delete_event_token'))) {
  // do db stuff
}

也就是说,在块操作中,CSRF令牌已经为您处理过了,所以您不需要检查它。

票数 1
EN

Stack Overflow用户

发布于 2014-01-30 18:52:55

你为什么要测试0(0)?

记住,零和假是不一样的。试着换到

代码语言:javascript
运行
复制
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
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21453869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档