сеанс с разными идентификаторами сеансов на разных страницах одного домена, незащищенные страницы! - PullRequest
0 голосов
/ 24 марта 2011

Я тяну волосы за этот. Я попытался создать простой скрипт для хранения сессий, чтобы, когда пользователь закрывает там браузер, он мог вернуться позже, и его корзина покупок все еще работала. Казалось, что все идет хорошо, пока я не заметил, что на некоторых предметах в корзине были те же предметы, что и в предыдущем. После некоторых проверок я заметил, что на этих нечетных страницах идентификатор сессии был другим! Вот мой код, который находится наверху моей платформы.

<?php

session_start();
function sessions(){
    if( ! isset( $_COOKIE['PHPSESSID'] ) ) {
        setcookie( "PHPSESSID", session_id(), strtotime('+ 30 days') );
    }else{
        $con = Database::getInstance();
        if( session_id() != $_COOKIE['PHPSESSID'] ) {
            $re = $con->query( "SELECT * FROM `" . TABLE_PREFIX . "_tbl_sessions` WHERE session_id = '" . $_COOKIE['PHPSESSID'] . "'" );
            if( $re->num_rows != 0 ) {
                $ar = $re->fetch_assoc();
                $id = $ar['id'];
                $_SESSION['basket'] = unserialize( stripslashes( $ar['basket'] ) );
                $con->query("UPDATE `" . TABLE_PREFIX . "_tbl_sessions` SET session_id = '" . session_id() . "' WHERE id = '$id' " );
            }
            unset($_COOKIE['PHPSESSID']);
            setcookie( "PHPSESSID", session_id(), strtotime('+ 30 days') );
            header('Location: ' . get_base_url() );
        }else{
            $re = $con->query( "SELECT * FROM `" . TABLE_PREFIX . "_tbl_sessions` WHERE session_id = '" . $_COOKIE['PHPSESSID'] . "'" );
            if( $re->num_rows != 0 ) {
                $ar = $re->fetch_assoc();
                $id = $ar['id'];
                if( ! empty( $_SESSION['basket'] ) ) {
                    $con->query("UPDATE `" . TABLE_PREFIX . "_tbl_sessions` SET session_id = '" . $_COOKIE['PHPSESSID'] . "', data = '" . addslashes( serialize( $_SESSION['basket'] ) ) . "' WHERE id = '$id'" );
                }else{
                    $con->query( "DELETE FROM `" . TABLE_PREFIX . "_tbl_sessions` WHERE id = '$id'" );  
                }
            }else{
                if( ! empty( $_SESSION['basket'] ) ) {
                    $con->query( "INSERT INTO `" . TABLE_PREFIX . "_tbl_sessions` ( `session_id`, `stamp`, `data`) VALUES ( '" . $_COOKIE['PHPSESSID'] . "', NOW(), '" . addslashes( serialize( $_SESSION['basket'] ) ) . "' )" );  
                }
            }
        }
    }
    echo 'cookie: ' . $_COOKIE['PHPSESSID'] . ' : session(): ' . session_id();
}

?>

любая помощь в этом вопросе очень ценится.

** РЕДАКТИРОВАТЬ **

Я пытался сделать это проще, но все же проблема

<?php

function sessions(){
    $con = Database::getInstance();
    if( session_id() == '' ) {
        if( isset( $_COOKIE['session_id'] ) ) {
            session_start();
            $re = $con->query( "SELECT * FROM `" . TABLE_PREFIX . "_tbl_sessions` WHERE session_id = '" . $_COOKIE['session_id'] . "'" );
            if( $re->num_rows != 0 ) {
                $ar = $re->fetch_assoc();
                $id = $ar['id'];
                if( session_id() != $_COOKIE['session_id'] ) {
                    $_COOKIE['session_id'] = session_id();
                    $con->query("UPDATE `" . TABLE_PREFIX . "_tbl_sessions` SET session_id = '" . session_id() . "' WHERE id = '$id' " );
                    $_SESSION['basket'] = unserialize( stripslashes( $ar['data'] ) );
                }else{
                    if( isset( $_SESSION['basket'] ) ) {
                        $con->query("UPDATE `" . TABLE_PREFIX . "_tbl_sessions` SET data = '" . addslashes( serialize( $_SESSION['basket'] ) ) . "' WHERE id = '$id' " );
                    }
                }   
            }else{
                $con->query( "INSERT INTO `" . TABLE_PREFIX . "_tbl_sessions` ( `session_id`, `stamp`, `data`) VALUES ( '" . $_COOKIE['session_id'] . "', NOW(), '' )" );       
            }
        }else{
            session_start();
            setcookie( "session_id", session_id(), strtotime('+ 30 days') );
            $_COOKIE['session_id'] = session_id();
        }
    }else{
        die('session has previously been created'); 
    }
    echo 'cookie: ' . $_COOKIE['session_id'] . ' : session(): ' . session_id();
}

?>

1 Ответ

0 голосов
/ 24 марта 2011
<?php

function sessions(){
    $con = Database::getInstance();
    if( session_id() == '' ) {
        session_start();
        if( isset( $_COOKIE['session_id'] ) ) {
            $re = $con->query( "SELECT * FROM `" . TABLE_PREFIX . "_tbl_sessions` WHERE session_id = '" . $_COOKIE['session_id'] . "'" );
            display_error( $con );
            if( $re->num_rows != 0 ) {
                $ar = $re->fetch_assoc();
                $id = $ar['id'];
                if( session_id() != $_COOKIE['session_id'] ) {
                    setcookie( "session_id", '', strtotime('- 30 days'), '/', 'localhost' );
                    setcookie( "session_id", session_id(), strtotime('+ 30 days'), '/', 'localhost' );
                    $con->query("UPDATE `" . TABLE_PREFIX . "_tbl_sessions` SET session_id = '" . session_id() . "' WHERE id = '$id' " );
                    display_error( $con );
                    $_SESSION['basket'] = unserialize( stripslashes( $ar['data'] ) );
                }else{
                    if( isset( $_SESSION['basket'] ) ) {
                        $con->query("UPDATE `" . TABLE_PREFIX . "_tbl_sessions` SET data = '" . addslashes( serialize( $_SESSION['basket'] ) ) . "' WHERE id = '$id' " );
                        display_error( $con );
                    }
                }   
            }else{
                $con->query( "INSERT INTO `" . TABLE_PREFIX . "_tbl_sessions` ( `session_id`, `stamp`, `data`) VALUES ( '" . $_COOKIE['session_id'] . "', NOW(), '' )" );       
                display_error( $con );
            }
        }else{
            setcookie( "session_id", session_id(), strtotime('+ 30 days'), '/', 'localhost' );
            $_COOKIE['session_id'] = session_id();
        }
    }else{
        die('session has previously been created'); 
    }
    echo 'cookie: ' . $_COOKIE['session_id'] . ' : session(): ' . session_id();
}

function display_error( $con ) {
    if( isset( $con->error ) && $con->error != '' ) {
        die( $con->error );
    }
}

?>

Выше работает! $ _ COOKIES ['foo'] = 'bar' * не * переоценивает cookie в браузере только во время скрипта.

Другая проблеманеобходимо установить путь и домен файла cookie, чтобы остановить создание нескольких файлов cookie.Работает и работает без сбоев!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...