提交表单时,会话变量的值会更改。

Nia*_*all 5 php forms session csrf

我正在尝试将 CSRF 令牌添加到我的表单中。问题是,当我将其添加到文件中时,我会回显会话令牌,并且它与名为“token”的输入中的令牌相匹配。但是,当我提交页面并使用 Token::check 时,它返回 false,如果我再次从输入和会话中回显令牌值,我会看到会话值已更改,但输入值保持不变。

<?php
class Token{
public static function generate(){
    return $_SESSION['token'] =    base64_encode(openssl_random_pseudo_bytes(32)); 
}

public static function check($token){
    if(isset($_SESSION['token']) && $token == $_SESSION['token']){
        unset($_SESSION['token']);
        return true;
    }else{
        return false;
    }
}
}
?>
Run Code Online (Sandbox Code Playgroud)

这是控制表单的php。

$token = $_POST['token'];
if(Token::check($token)){ //Continue with more code }
Run Code Online (Sandbox Code Playgroud)

以下是处理令牌的表单部分:

<input type="hidden" name="user_id_update" value="<?php echo $user_info[0][0]->id; ?>"/>
                            <input type="hidden" name="time_update" value="<?php echo $time; ?>"/>
                            <input type="hidden" name="token" value="<?php echo Token::generate(); ?>"
                            <hr />

                            <div class="form-group">
                                <input type="submit" id="submit_update" value="Update" class="btn btn-success"/>
                            </div>
Run Code Online (Sandbox Code Playgroud)

如果有人能对此有所了解,我将非常感激,因为我已经在网上搜索了几个小时,但找不到答案。谢谢。

Nia*_*all 0

经过一番挖掘代码后。我发现这些文件添加到网站的顺序意味着生成令牌的代码位于表单控制器之上。因此,当发布表单时,它每次都会创建一个新的会话变量,因此发布的数据与存储在会话变量中的数据不同。更改这些文件的包含顺序解决了问题。希望这可以帮助将来的人。