Что приводит к тому, что значение сеанса изменяется по сравнению со вставленным - PullRequest
0 голосов
/ 31 мая 2018

У меня есть следующие классы A Класс Session

<?php
class Session
{
    public static function exists($name)
    {
        return (isset($_SESSION[$name])) ? true : false;
    }

    public static function delete($name)
    {
        if (self::exists($name))
        {
            unset($_SESSION[$name]);
        }
    }

    public static function get($name)
    {
        return $_SESSION[$name];
    }

    public static function put($name, $value)
    {
        return $_SESSION[$name] = $value;
    }
}

A Класс токена

<?php
class Token
{
    public static function generate()
    {
        return Session::put('token', md5(uniqid()));
    }

    public static function check($token)
    {
        //var_dump(Session::get('token'));
        //var_dump($token);
        //die();

        if(Session::exists('token') && $token === Session::get('token'))
        {
            Session::delete('token');
            return true;
        }
        return false;
    }
}

Входной класс

<?php
class Input
{
    public static function exists($type = 'post')
    {
        switch ($type)
        {
            case 'post':
                return (!empty($_POST)) ? true : false;
                break;
            case 'get':
                return (!empty($_GET)) ? true : false;
                break;  

            case 'uri':
                //echo 'Well we are here. <br>'; 
                return (!empty($_SERVER['REQUEST_URI'])) ? true : false;
                break;
            case 'session':
                return (!empty($_SESSION)) ? true : false;  
            default:
                return false;
                break;
        }
    }

    public function get($item, $method = 'post')
    {
        switch ($method) {
            case 'post':
                if(isset($_POST[$item])) return $_POST[$item];
                break;
            case 'get':
                if(isset($_GET[$item])) return $_GET[$item];
                break;
            case 'session':
                if(isset($_SESSION[$item])) return $_SESSION[$item];
                break;  
            case 'server':
                if(isset($_SERVER[$item])) return $_SERVER[$item];
                break;
            default:
                return "";
                break;
        }
    }
}

У меня также есть форма регистрации

<div class="glob-main-contents-wrapper">
    <span class="signup-header">
        <h1>Sign up</h1>
        <a href="http://localhost/mysite/signin">Already a member?</a>
    </span>
    <form action="http://localhost/mysite/scripts/signup" id="signup-form" class="signup-form" method="post">
        <div class="field">
            <input type="text" class="username" id="username" name="username" placeholder=" Username" value="<?php echo Input::get('username', 'session') ?>">

            <span class="field-error" id="username-error">

            </span>
        </div>

        <div class="field">
            <input type="text" class="email" id="email" name="email" placeholder="Email" value="<?php echo Input::get('email', 'session') ?>">

            <span class="field-error" id="email-error">

            </span>
        </div>

        <div class="field">
            <input type="password" class="password" id="password" name="password" placeholder="Password">

            <span class="field-error" id="password-error">

            </span>
        </div>

         <div class="field">
            <input type="text" class="name" id="name" name="name" placeholder="Full Name" value="<?php echo Input::get('name', 'session') ?>">

            <span class="field-error" id="name-error">

            </span>
        </div>

        <div class="field">
            <input type="text" class="bio" id="bio" name="bio" placeholder="Biography" value="<?php echo Input::get('bio', 'session') ?>"">

            <span class="field-error" id="bio-error">

            </span>
        </div>

        <div class="field">
            <select class="timezone" id="timezone" name="timezone" placeholder="TimeZone" style="width: 300px">
                <?php
                    $date = new Date_Time;
                    $timezones = $date->timezones();
                    foreach ($timezones as $key => $timezone)
                    {
                ?>
                        <option value="<?php echo $timezone; ?>" <?php if($timezone === 'UTC') echo 'selected="selected"' ?>><?php echo $timezone; ?></option>
                <?php
                    }
                ?>
            </select>

            <span class="field-error" id="timezone-error">

            </span>
        </div>

        <div class="field">
            <input type="text" class="site" id="site" name="site" placeholder="Website" value="<?php echo Input::get('site', 'session') ?>">

            <span class="field-error" id="website-error">

            </span>
        </div>

        <div class="field">
            <button type="submit" class="reg-btn" id="reg-btn">Sign up</button>

            <span class="field-error" id="form-error">

                </span>
        </div>

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

Затем, наконец, у меня есть следующий скрипт для действия в форме

if(Input::exists()):
    Session::put('username', Input::get('username'));
    Session::put('email', Input::get('email'));
    Session::put('name', Input::get('name'));
    Session::put('bio', Input::get('bio'));
    Session::put('site', Input::get('site'));

    if(Token::check(Input::get('token'))):
        $errors = array();
        if(empty($_POST['username'])):
            $errors[] = 'username=is required';
        else:
            //other username checks
        endif;
        //checks for other form inputs

        if(empty($errors)):
            try{ //insert into database } 
            catch(Exception $e){header('http://localhost/mysite/signup'. '/errors=?error=something went wrong');}
        else:
            $result = '';
            foreach ($errors as $key => $error)
            {
                $result .= '&'. $error;
            }
            Router::to('http://localhost/mysite/signup'. '/errors=?' .$result);
        endif;
    else:
        Router::to('http://localhost/mysite/signup'. '/errors=?invalid token');
    endif;
endif;

Когда я иду по адресу http://localhost/mysite/signup и я ввожу все данные формыправильно, т.е. пройти все проверки ошибок в сценарии, я могу зарегистрироваться без проблем.Однако, когда я делаю ошибку, то есть не выполняю хотя бы одну проверку на наличие ошибок, я получаю URL-адрес, подобный этому http://localhost/mysite/signin/errors=?&username=is20%required, который я хочу, чтобы я мог использовать переменные get для выделения ошибок.Когда я пытаюсь зарегистрироваться, я получаю неверный URL токена.Это происходит, есть ли у меня ошибки или нет.После раскомментирования vardumps в классе Token я обнаружил, что значение в $ _SESSION ['token'] не равно сгенерированному значению.Что может быть причиной того, что мой $ _SESSION ['token'] отличается от сгенерированного?

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