За последние 24 часа нас посетили 54357 программистов и 1776 роботов. Сейчас ищут 1042 программиста ...

Обновление токена

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 5 июл 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    Кто сталкивался, с подобной ситуацией?

    На сайте сделал автоматический вход, если был закрыт браузер.

    Проблема в том, что, при входе, токен перезаписывается в мозиле и в опере, а в хроме, не перезаписывается, почему так?

    PHP:
    1.     function authCookie() {
    2.    
    3.         $sql = "SELECT DISTINCT `id`, `login`, `password`, `avatar` FROM users WHERE token = :tok";
    4.            
    5.         $queryUser = $this->db->prepare($sql);
    6.         $queryUser ->bindValue(':tok', trim($_COOKIE['user']), PDO::PARAM_STR);
    7.         $queryUser->execute();
    8.        
    9.         $queryUser->setFetchMode(PDO::FETCH_ASSOC);
    10.         $userArray = $queryUser->fetchAll();
    11.        
    12.         if(!empty($userArray[0]['login'])) {
    13.             $userLogin = $userArray[0]['login'];
    14.             $userId = $userArray[0]['id'];
    15.             $userAvatar = $userArray[0]['avatar'];
    16.            
    17.             $salt = 'szdfsdfgg;
    18.            $tokenstr = strval(date('s')) . $salt;
    19.            $token = md5($tokenstr);
    20.          
    21.          
    22.            $sql = "UPDATE users SET token ='" . $token . "' WHERE login = :log2";
    23.            $queryToket = $this->db->prepare($sql);
    24.            $queryToket->bindValue(':log2', trim($userLogin), PDO::PARAM_STR);
    25.            $queryToket->execute();
    26.          
    27.                  
    28.            $_SESSION['token'] = $token;
    29.            $_SESSION['user'] = $userLogin;
    30.            $_SESSION['id'] = $userId;
    31.            $_SESSION['avatar'] = $userAvatar;
    32.    
    33.            output_add_rewrite_var('token', $token);
    34.            header('Location: ./index.php?token='.$_SESSION['token']);
    35.        }
    36.      
    37.      
    38.    }
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    17 строка не закрыт апостроф
    --- Добавлено ---
    Аутентификация при регистрации new user
    PHP:
    1. <?php
    2.  
    3. namespace Page\register;
    4.  
    5. use Application\System\Mouse\SQL;
    6.  
    7. class init extends \Engine
    8. {
    9.    
    10.     public static function StaticInit()
    11.     {
    12.         self::$DOCUMENT_STYLE = 'register';
    13.        
    14.         self::_( 'SET_PAGE_TITLE', self::$RAY['PAGE']['register']['TITLE'] );
    15.        
    16.         if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
    17.         {
    18.             header ( 'Content-type: application/json' );
    19.            
    20.             self::RegisterAccount();
    21.         }
    22.         else
    23.         {
    24.             setcookie ( 'REGISTER', $_SERVER['REQUEST_TIME'] );
    25.         }
    26.     }
    27.     public static function RegisterAccount()
    28.     {
    29.         $ARGS = [
    30.             'username' => [
    31.                 'filter' => FILTER_VALIDATE_REGEXP,
    32.                 'options' => [
    33.                     'regexp' => '/^[A-Za-z0-9_-]{3,25}$/'
    34.                 ]
    35.             ],
    36.             'email' => FILTER_VALIDATE_EMAIL,
    37.             'password' => FILTER_UNSAFE_RAW,
    38.             'confirm_password' => FILTER_UNSAFE_RAW
    39.         ];
    40.        
    41.         $INPUTS = filter_input_array ( INPUT_POST, $ARGS );
    42.        
    43.         $E = [];
    44.        
    45.         if ( $INPUTS['username'] === NULL )
    46.         {
    47.             $E['username'] = 'Undefined username :(';
    48.         }
    49.         elseif ( $INPUTS['username'] === FALSE )
    50.         {
    51.             $E['username'] = 'Пожалуйста, введите имя, содержащее от 3-х до 25 латинских символов.';
    52.         }
    53.         elseif ( SQL::P( 'SELECT ID FROM USRACCOUNT WHERE lower ( USERNAME ) = ?', [ strtolower ( $INPUTS['username'] ) ] ) -> rowCount() > 0 )
    54.         {
    55.             $E['username'] = 'Введенное имя уже используется.';
    56.         }
    57.         if ( $INPUTS['email'] === NULL )
    58.         {
    59.             $E['email'] = 'Undefined email :(';
    60.         }
    61.         elseif ( $INPUTS['email'] === FALSE )
    62.         {
    63.             $E['email'] = 'Адрес электронной почты должен быть валидным.';
    64.         }
    65.         elseif ( SQL::P( 'SELECT ID FROM USRACCOUNT WHERE lower ( EMAIL ) = ?', [ strtolower ( $INPUTS['email'] ) ] ) -> rowCount() > 0 )
    66.         {
    67.             $E['email'] = 'Введенная почта уже используется.';
    68.         }
    69.         if ( $INPUTS['password'] === NULL )
    70.         {
    71.             $E['password'] = 'Undefined password :(';
    72.         }
    73.         elseif ( empty ( $INPUTS['password'] ) )
    74.         {
    75.             $E['password'] = 'Пожалуйста, введите пароль.';
    76.         }
    77.         elseif ( $INPUTS['password'] != $INPUTS['confirm_password'] )
    78.         {
    79.             $E['password'] = 'Введенные пароли не совпадают.';
    80.         }
    81.        
    82.         # errors count
    83.        if ( count ( $E ) < 1 )
    84.         {
    85.             $HASH = password_hash ( $INPUTS['password'], PASSWORD_DEFAULT );
    86.            
    87.             SQL::P( 'INSERT INTO USRACCOUNT ( USERNAME, EMAIL, PASSWORD, STATUS, DATAREG, LASTONLINE ) VALUES ( ?,?,?,?,?,? )',
    88.             [
    89.                 $INPUTS['username'],
    90.                 $INPUTS['email'],
    91.                 $HASH,
    92.                 1,
    93.                 $_SERVER['REQUEST_TIME'],
    94.                 $_SERVER['REQUEST_TIME']
    95.             ] );
    96.            
    97.             $UID = SQL::lastInsertId();
    98.            
    99.             $SID = md5 ( $UID . $INPUTS['username'] . $HASH );
    100.            
    101.             SQL::P( 'INSERT INTO SESSREM ( SID, UID, TIMEOUT ) VALUES ( ?,?,? )',
    102.             [
    103.                 $SID,
    104.                 $UID,
    105.                 strtotime ( self::$RAY['RAY']['AUTHME']['LIMIT'] )
    106.             ] );
    107.            
    108.             setcookie ( 'AuthMe', $SID, strtotime ( self::$RAY['RAY']['AUTHME']['LIMIT'] ), '/' );
    109.            
    110.             exit ( self::_( 'JSON', [ 'REDIRECT' => '/?' . $INPUTS['username'] ] ) );
    111.         }
    112.         else
    113.         {
    114.             exit ( self::_( 'JSON', [ 'MSGERROR' => $E ] ) );
    115.         }
    116.     }
    117. }
    --- Добавлено ---
    Обрати внимание на куки AuthMe. При восстановлении именно она играет роль
    --- Добавлено ---
    Авторизация:
    PHP:
    1. <?php
    2.  
    3. /*
    4. Насильственное деяние авторизации пользователя с помощью
    5. БД, а не после работой с session_start :\
    6. */
    7.  
    8. namespace Application\Controller\User;
    9.  
    10. use \Application\System\Mouse\SQL;
    11.  
    12. class AuthMe extends \Engine
    13. {
    14.     public static
    15.         $UID,
    16.         $USERNAME = 'Гость',
    17.         $GROUP_TITLE,
    18.         $GROUP_ACCESS,
    19.         $GROUP_COLOR,
    20.         $USER_BANNED_IN = FALSE,
    21.         $USER_LOGGED_IN = FALSE;
    22.        
    23.     public static function StaticInit(): void
    24.     {
    25.         SQL::P( "DELETE FROM SESSREM WHERE TIMEOUT < {$_SERVER['REQUEST_TIME']}" );
    26.        
    27.         if ( ( $_SESSION['LOGGED'] ?? 0 ) === TRUE && SQL::P( 'SELECT SID FROM SESSREM WHERE UID = ?', [ $_SESSION['ID'] ] ) -> fetchColumn() == $_COOKIE['AuthMe'] )
    28.         {
    29.             self::$UID                = $_SESSION['ID'];
    30.             self::$USERNAME            = $_SESSION['USERNAME'];
    31.             self::$GROUP_TITLE        = $_SESSION['NAME'];
    32.             self::$GROUP_ACCESS        = $_SESSION['ACCESS'];
    33.             self::$GROUP_COLOR        = $_SESSION['COLOR'];
    34.             self::$USER_LOGGED_IN    = $_SESSION['LOGGED'];
    35.         }
    36.         elseif ( filter_input ( INPUT_COOKIE, 'AuthMe', FILTER_DEFAULT, [ 'options' => [ 'regexp' => '/^[a-f0-9]{32}$/' ] ] ) )
    37.         {
    38.             $SQL = 'SELECT
    39.                U.ID,
    40.                U.USERNAME,
    41.                U.PASSWORD,
    42.                G.NAME,
    43.                G.ACCESS,
    44.                G.COLOR,
    45.                B.ID AS BAN
    46.            FROM
    47.                SESSREM S
    48.                LEFT JOIN USRACCOUNT U ON U.ID = S.UID
    49.                LEFT JOIN GROUP_USER G ON G.ID = U.STATUS
    50.                LEFT JOIN USRBANNED B ON B.UID = U.ID
    51.            WHERE
    52.                S.SID = ?';
    53.            
    54.             $PDO = SQL::P( $SQL, [ $_COOKIE['AuthMe'] ] );
    55.            
    56.             if ( $PDO -> rowCount() > 0 )
    57.             {
    58.                 $U = $PDO -> fetch();
    59.                
    60.                 if ( $U['BAN'] !== NULL )
    61.                 {
    62.                     self::$USER_BANNED_IN = TRUE;
    63.                    
    64.                     setcookie ( 'AuthMe', '', -1 );
    65.                 }
    66.                 elseif ( md5 ( $U['ID'] . $U['USERNAME'] . $U['PASSWORD'] ) == $_COOKIE['AuthMe'] )
    67.                 {
    68.                     self::$UID                = $_SESSION['ID']        = $U['ID'];
    69.                     self::$USERNAME            = $_SESSION['USERNAME']    = $U['USERNAME'];
    70.                     self::$GROUP_TITLE        = $_SESSION['NAME']        = $U['NAME'];
    71.                     self::$GROUP_ACCESS        = $_SESSION['ACCESS']    = $U['ACCESS'];
    72.                     self::$GROUP_COLOR        = $_SESSION['COLOR']    = $U['COLOR'];
    73.                     self::$USER_LOGGED_IN    = $_SESSION['LOGGED']    = TRUE;
    74.                    
    75.                     SQL::P( 'UPDATE SESSREM SET TIMEOUT = ? WHERE SID = ?', [ strtotime ( self::$RAY['RAY']['AUTHME']['LIMIT'] ), $_COOKIE['AuthMe'] ]  );
    76.                    
    77.                     SQL::P( 'UPDATE USRACCOUNT SET LASTONLINE = ? WHERE ID = ?', [ $_SERVER['REQUEST_TIME'], self::$UID ] );
    78.                    
    79.                     setcookie ( 'AuthMe', $_COOKIE['AuthMe'], strtotime ( self::$RAY['RAY']['AUTHME']['LIMIT'] ), '/' );
    80.                 }
    81.                 else
    82.                 {
    83.                     # передать сообщение с ip о левой куки с попыткой обхода.
    84.                }
    85.             }
    86.             else
    87.             {
    88.                 if ( isset ( $_COOKIE['AuthMe'] ) )
    89.                 {
    90.                     setcookie ( 'AuthMe', '', -1 );
    91.                 }
    92.             }
    93.         }
    94.     }
    95. }
    --- Добавлено ---
    Данные скрипты день назад хотел еще залить на форум для обсуждения / до ума доделать. Но мол стремно - помидоры не люблю.
     
    AlexProg нравится это.
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.211
    Симпатии:
    186
    В коде апостроф закрыт, это я его не закрыл, когда сюда, код копировал.
     
  4. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Не понял как ошибка обрабатывается!? Если их несколько?
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    каждая ошибка содержит свой ключ
    username
    email
    password

    данные передаются в json формате.
    Js код отправил данные на сервер и получил ответ в виде json текста
    код(отрывок) дальнейшего парсинга был что-то подобного этого:
    Код (Javascript):
    1. dataType: 'JSON',
    2.             success: function ( json )
    3.             {
    4.              
    5.                 if ( json.ELEMENTS.REDIRECT != undefined )
    6.                 {
    7.                     window.location.href = json.ELEMENTS.REDIRECT;
    8.                 }
    9.                 if ( json.ELEMENTS.MSGERROR != undefined )
    10.                 {
    11.                     $( '.errorPanel' ).remove();
    12.                  
    13.                     $( '.RAY_WRAPPER_REGISTER' ).prepend( '<div class="errorPanel"></div>' );
    14.                  
    15.                     i = 1;
    16.                  
    17.                     $.each( json.ELEMENTS.MSGERROR, function ( index, value )
    18.                     {
    19.                         $( '.errorPanel' ).append( '<p>' + i++ + ') ' + value + '</p>' );
    20.                     });
    21.                 }
    22.             }
     
    AlexProg нравится это.