在 Yii 内部的登录表单中添加令牌方法


Adding token method to login form inside of Yii

所以我正在尝试将令牌方法添加为登录名中的额外安全功能,我所做的如下

登录.php

$token = $_SESSION['token'] = md5(uniqid(mt_rand(),true));
if(Yii::app()->user->hasFlash('error')){
    ?>
    <div class="flashMessage">
        <?php echo Yii::app()->user->getFlash('error') ?>
    </div>
<?php
}
?>
    <input type="hidden" name="token" value="<?php echo $token ?>"/>
//Rest of the form

现在内部操作登录我有以下内容。

// collect user input data
        if(isset($_POST['LoginForm'])){
            //Check if the token matches
            if($_POST['token'] == $_SESSION['token']){
                $model->attributes=$_POST['LoginForm'];
                // validate user input and redirect to the previous page if valid
                if($model->validate() && $model->login())
                    $this->redirect(Yii::app()->user->returnUrl);
            }
        }

现在,当我尝试登录时,出现以下错误

未定义的变量:_SESSION

我不明白为什么它告诉会话不存在,因为它具有相同的名称。

我赞赏的任何帮助

Yii中使用SESSION,就像以下方法之一一样:

1.使用 Yii::app()->session

Yii::app()->session['KEY']='VALUE'; //setting session 
$key=Yii::app()->session['KEY']; //getting session

2.使用 Yii 的状态

Yii::app()->user->setState('KEY','VALUE'); //setting session
$key=Yii::app()->user->getState('KEY'); //getting session 

但是状态和会话之间有什么区别?

如果您使用 setState() | State,应用程序之间冲突的概率将通过添加哈希来降低,因为它在会话 KEY 中添加了一个哈希,例如,如果您从 $_SESSION 获得转储,您将看到:

'0f42ca4d61b26371fee67cc51d7b48d3KEY' => 'VALUE' 

但是如果你使用Yii::app()->session它将存储普通的KEY,如下所示:

'KEY' => 'VALUE'

你可以检查 SetState()、getState() 和 hasState()