0

数日前、サイトの認証システムに Cookie 機能を実装しました。基本的に、認証システムはセッションと Cookie の両方を使用して認証を確認します。すべて正常に機能していましたが、今日、奇妙な問題に気付きました。つまり、ブラウザーを閉じて再度開いた後、Cookie はブラウザーに残っていますが、認証されていません。今のところ、ルートフォルダーにあるindex.php、分類されたディレクトリに分類された.php(classifieds/index.php)、ユーザーディレクトリにあるlogin.php(users/login.php)の3つのページしかありません。 ..だから、ブラウザを再起動してindex.phpを閲覧した後、私は認証されていません.classified.phpでも同じですが、login.phpは私を認証します. 奇妙なことに、すべて同じコードを使用しています..

これは header.php です (3 つのファイルすべてに含まれています)。

        <?php
        //header.php
        // if cookie is set, authenticate directly
        if (isset($_COOKIE['AUTH'])) {
            include_once("../includes/initialize.php"); // requires and initializes all the necessary functions and classes
            // cookie is set, lets see if its vailed and log someone in
            global $database;
            global $salt;
            $now = time();

            list($identifier, $token) = explode(':', $_COOKIE['AUTH']);
            if (ctype_alnum($identifier) && ctype_alnum($token)) {
                $user = User::find_by_identifier($identifier);
                if ($token != $user->token) {
                    setcookie ("AUTH", "", time() - 3600);
                    session_destroy();
                    // echo "wrong token";
                    // fail because the key doesn't match
                } elseif ($now > $user->timeout) {
                    setcookie ("AUTH", "", time() - 3600);
                    session_destroy();
                    // echo "timeout";
                    // fail because the cookie has expired
                } elseif ($identifier!= md5($salt.md5($user->id.$salt))) {
                    // fail because the identifiers does not match
                    setcookie ("AUTH", "", time() - 3600);
                    session_destroy();
                    // echo "wrong identifier";
                } else {
                    /*  Success  */
                    //  $found_user = User::cookie_authenticate($user->email, $user->passwor,$ip);

                    $session->cookie_login($user);
                }
            } else {
                    /* failed because the information is not in the correct format in the cookie */
                setcookie ("AUTH", "", time() - 3600);
                session_destroy();
            }
        }
        ?>

index.php
        <?php
        //index.php

        include_once("includes/initialize.php"); // requires and initializes all the necessary functions and classes

        include_template("header.php");

        ?>

users/login.php

        <?php 
        //login.php
        include("../includes/initialize.php"); // requires and initializes all the necessary functions and classes

        //if aready logged in
        if($session->is_logged_in()) {
            $session->message("<script> TINY.box.show({html:'You are already logged in!',animate:false,close:false,mask:false,boxid:'error',autohide:3,top:-14,left:-17})</script>");
          redirect_to("../index.php");
        }

        include_template("header.php");

        ?>

index.php で気付いたのは、ブラウザーに AUTH Cookie が保存されていても、

        if(isset($_COOKIE['auth'])) 

header.php の isset 関数は、Cookie が index.php に設定されているかどうかを実際にはチェックしませんが、login.php はチェックします。問題がログイン クラスまたは Cookie クラスにないことがわかっているため、さらにコードを投稿することはありません。 login.php は Cookie を認証します.最初の質問は、ブラウザーで Cookie AUTH が設定されているにもかかわらず、index.php が isset($_COOKIE['AUTH'])) 関数を実際に渡さないのはなぜですか?
2 つ目は、isset 関数が記述されている同じ header.php ファイルが両方に含まれているにもかかわらず、login.php が同じ isset cookie 関数を渡すのはなぜですか。
質問を明確にしたことを願っています。できる限り試しました..申し訳ありませんが、質問をする私のスキルは非常に貧弱です..

    public static function authenticate($username="", $password="",$ip) { //login function to authenticate user 

        global $database;
        $username = $database->escape_value($username);
        $password = $database->escape_value(sha1($password));
        $ip = $_SERVER['REMOTE_ADDR'];
        $identifier = md5( $salt . md5($username . $salt ) );

        $query = $database->query("SELECT id FROM ".static::$table_name." WHERE ip = '$ip' AND banned = '1'");

        if ($database->num_rows($query) >= 1 ) { //change to 1
            echo "<div class=\"warning\"> Your IP has been blocked, Possible Spam attempts. Please contact the Admin for further details.</div>";
        } else {
            $sql  = "SELECT * FROM ".static::$table_name." ";
            $sql .= "WHERE email = '{$username}' ";
            $sql .= "AND password = '{$password}'  ";
    //      $sql .= "AND active = '1'  ";
            $sql .= "LIMIT 1";
            $result_array = self::find_by_sql($sql);
            return !empty($result_array) ? array_shift($result_array) : false;
        }
    }

    public function login($user) {
        // database should find user based on username/password
        if($user){
            User::set_login_time($user->id); // set logged in time and identifier
            User::set_cookie_details($user->id); // set cookie expiration time and token
            $this->user_id  = $_SESSION['user_id']       = $user->id;
            $this->username = $_SESSION['username']      = $user->username;
            $this->user_level = $_SESSION['user_level']  = $user->level;
            $this->banned = $_SESSION['user_banned'] ;
            $this->logged_in = true;
        }
    }
    public function is_logged_in() {
        return $this->logged_in;
    }

    public  function cookie_login($user) {
        // if cookie is set, check and match the cookies identifier and token with the stored identifier and token in the database
        // if it matches then login without credentials
        $this->user_id  = $_SESSION['user_id']       = $user->id;
        $this->username = $_SESSION['username']      = $user->username;
        $this->user_level = $_SESSION['user_level']  = $user->level;
        $this->banned = $_SESSION['user_banned'] ;
        $this->logged_in = true;
    }       

    public static function set_login_time($user_id) {
        global $database;
        global $salt;
        $identifier = md5( $salt . md5($user_id . $salt ));
        $time = time();
        $sql = "UPDATE ".static::$table_name." SET modified = '$time',identifier = '$identifier' WHERE id = '{$user_id}' LIMIT 1 "; 
        $database->query($sql);
        return ($database->affected_rows() == 1) ? true : false;
    }

    public static function set_cookie_details($user_id) {
        global $database;
        $user = self::find_by_id($user_id);
        $identifier = $user->identifier;
        $key = md5(uniqid(rand(), true));
        $timeout = time() + 60 * 60 * 24 * 7; // 1 week
        setcookie('AUTH', "$identifier:$key", $timeout);
        $sql = "UPDATE ".static::$table_name." SET token = '$key', timeout = '$timeout' WHERE id = '{$user_id}' LIMIT 1 ";
        $database->query($sql);
        return ($database->affected_rows() == 1) ? true : false;
    }

    $user = User::authenticate($username, $password,$ip); // if returned true

    $session->login($user);
4

0 に答える 0