更新请再看一遍 - CSRF 令牌不匹配服务器(本地工作正常?!)

UPDATE please look again - CSRF token mismatch server (local its working fine?!)

我没有 post 任何代码,因为它有 1000 多行代码,我不知道去哪里搜索。现在我终于找到了 'error line',所以希望这个 post 可以投票。

当我在表单中提交数据时,应该是运行ning php 代码来检查数据与数据库中的数据。本地,它工作正常。服务器上没有。

当我 运行 本地网站并按 F5 时,它会打印一个布尔值 false。当我点击提交按钮时,它会打印一个布尔值 true。

当我 运行 服务器上的网站并按 F5 时,它会打印一个布尔值 false。但是当我点击提交按钮时,它会打印一个布尔值 FALSE 而不是 true!

原因:服务器会话中设置的令牌与点击提交按钮发送的令牌不同。这就是为什么 if 语句不 运行.

login.php

<?php
require_once("core/init.php");
require "/templates/header.php"; 
?>
<div id="text"> <?php

    if(Input::exists()) {
        var_dump(Token::check(Input::get("token"))); //on server always false!
        print_r(Input::get("token")); //(because this is something different then the token in the session, see code token class)
        //if(Token::check(Input::get("token"))) {
            $validate = new Validate();
            $validation = $validate->check($_POST, array(
                "username" => array("required" => true),
                "password" => array("required" => true)
                ));

            if($validation->passed()) {
                $user = new User();

                $remember = (Input::get("remember") === "on") ? true : false;
                $login = $user->login(Input::get("username"), Input::get("password"), $remember);

                if($login) {
                    Redirect::to("index.php");
                }
                else {
                    echo "Sorry, logging in failed."; 
                }
            }
            else {
                foreach($validation->errors() as $error) {
                    echo $error, "<br>";
                }
            }
        //}
    }
    ?>

    <form action="" method="post"> 
        <div class="field">
            <label for="username">Username</label>
            <input type="text" name="username" id="username" autocomplete="off">
        </div>

        <div class="field">
            <label for="password">Password</label>
            <input type="password" name="password" id="password" autocomplete="off">
        </div>

        <div class="field">
            <label for="remember">
                <input type="checkbox" name="remember" id="remember">Remember me
            </label>
        </div>

        <input type="hidden" name="token" value="<?php echo Token::generate(); ?>">
        <input type="submit" value="Log in">
    </form> 

</div>

令牌class

class Token{
    public static function generate() {
        return Session::put(Config::get("session/token_name"), md5(uniqid()));
    }

    public static function check($token) {
        //check if token excists in the session
        $tokenName = Config::get("session/token_name"); //get tokenname 
print_r(Session::get($tokenName)); //local they are the same, on server not!
print_r($token);

        if(Session::exists($tokenName) && $token === Session::get($tokenName)) { 
            //check if session exists with token 
            Session::delete($tokenName); //delete, dont need anymore
            return true;
        }



        return false; 
    }

}

我建议您正确检查所有放在表单的 action 属性中的链接,或者可能是其他一些链接。

我认为不存在任何与 cookie 相关的问题,除非您另外使用它。