Кто сталкивался, с подобной ситуацией? На сайте сделал автоматический вход, если был закрыт браузер. Проблема в том, что, при входе, токен перезаписывается в мозиле и в опере, а в хроме, не перезаписывается, почему так? PHP: function authCookie() { $sql = "SELECT DISTINCT `id`, `login`, `password`, `avatar` FROM users WHERE token = :tok"; $queryUser = $this->db->prepare($sql); $queryUser ->bindValue(':tok', trim($_COOKIE['user']), PDO::PARAM_STR); $queryUser->execute(); $queryUser->setFetchMode(PDO::FETCH_ASSOC); $userArray = $queryUser->fetchAll(); if(!empty($userArray[0]['login'])) { $userLogin = $userArray[0]['login']; $userId = $userArray[0]['id']; $userAvatar = $userArray[0]['avatar']; $salt = 'szdfsdfgg; $tokenstr = strval(date('s')) . $salt; $token = md5($tokenstr); $sql = "UPDATE users SET token ='" . $token . "' WHERE login = :log2"; $queryToket = $this->db->prepare($sql); $queryToket->bindValue(':log2', trim($userLogin), PDO::PARAM_STR); $queryToket->execute(); $_SESSION['token'] = $token; $_SESSION['user'] = $userLogin; $_SESSION['id'] = $userId; $_SESSION['avatar'] = $userAvatar; output_add_rewrite_var('token', $token); header('Location: ./index.php?token='.$_SESSION['token']); } }
17 строка не закрыт апостроф --- Добавлено --- Аутентификация при регистрации new user PHP: <?php namespace Page\register; use Application\System\Mouse\SQL; class init extends \Engine { public static function StaticInit() { self::$DOCUMENT_STYLE = 'register'; self::_( 'SET_PAGE_TITLE', self::$RAY['PAGE']['register']['TITLE'] ); if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) { header ( 'Content-type: application/json' ); self::RegisterAccount(); } else { setcookie ( 'REGISTER', $_SERVER['REQUEST_TIME'] ); } } public static function RegisterAccount() { $ARGS = [ 'username' => [ 'filter' => FILTER_VALIDATE_REGEXP, 'options' => [ 'regexp' => '/^[A-Za-z0-9_-]{3,25}$/' ] ], 'email' => FILTER_VALIDATE_EMAIL, 'password' => FILTER_UNSAFE_RAW, 'confirm_password' => FILTER_UNSAFE_RAW ]; $INPUTS = filter_input_array ( INPUT_POST, $ARGS ); $E = []; if ( $INPUTS['username'] === NULL ) { $E['username'] = 'Undefined username :('; } elseif ( $INPUTS['username'] === FALSE ) { $E['username'] = 'Пожалуйста, введите имя, содержащее от 3-х до 25 латинских символов.'; } elseif ( SQL::P( 'SELECT ID FROM USRACCOUNT WHERE lower ( USERNAME ) = ?', [ strtolower ( $INPUTS['username'] ) ] ) -> rowCount() > 0 ) { $E['username'] = 'Введенное имя уже используется.'; } if ( $INPUTS['email'] === NULL ) { $E['email'] = 'Undefined email :('; } elseif ( $INPUTS['email'] === FALSE ) { $E['email'] = 'Адрес электронной почты должен быть валидным.'; } elseif ( SQL::P( 'SELECT ID FROM USRACCOUNT WHERE lower ( EMAIL ) = ?', [ strtolower ( $INPUTS['email'] ) ] ) -> rowCount() > 0 ) { $E['email'] = 'Введенная почта уже используется.'; } if ( $INPUTS['password'] === NULL ) { $E['password'] = 'Undefined password :('; } elseif ( empty ( $INPUTS['password'] ) ) { $E['password'] = 'Пожалуйста, введите пароль.'; } elseif ( $INPUTS['password'] != $INPUTS['confirm_password'] ) { $E['password'] = 'Введенные пароли не совпадают.'; } # errors count if ( count ( $E ) < 1 ) { $HASH = password_hash ( $INPUTS['password'], PASSWORD_DEFAULT ); SQL::P( 'INSERT INTO USRACCOUNT ( USERNAME, EMAIL, PASSWORD, STATUS, DATAREG, LASTONLINE ) VALUES ( ?,?,?,?,?,? )', [ $INPUTS['username'], $INPUTS['email'], $HASH, 1, $_SERVER['REQUEST_TIME'], $_SERVER['REQUEST_TIME'] ] ); $UID = SQL::lastInsertId(); $SID = md5 ( $UID . $INPUTS['username'] . $HASH ); SQL::P( 'INSERT INTO SESSREM ( SID, UID, TIMEOUT ) VALUES ( ?,?,? )', [ $SID, $UID, strtotime ( self::$RAY['RAY']['AUTHME']['LIMIT'] ) ] ); setcookie ( 'AuthMe', $SID, strtotime ( self::$RAY['RAY']['AUTHME']['LIMIT'] ), '/' ); exit ( self::_( 'JSON', [ 'REDIRECT' => '/?' . $INPUTS['username'] ] ) ); } else { exit ( self::_( 'JSON', [ 'MSGERROR' => $E ] ) ); } } } --- Добавлено --- Обрати внимание на куки AuthMe. При восстановлении именно она играет роль --- Добавлено --- Авторизация: PHP: <?php /* Насильственное деяние авторизации пользователя с помощью БД, а не после работой с session_start :\ */ namespace Application\Controller\User; use \Application\System\Mouse\SQL; class AuthMe extends \Engine { public static $UID, $USERNAME = 'Гость', $GROUP_TITLE, $GROUP_ACCESS, $GROUP_COLOR, $USER_BANNED_IN = FALSE, $USER_LOGGED_IN = FALSE; public static function StaticInit(): void { SQL::P( "DELETE FROM SESSREM WHERE TIMEOUT < {$_SERVER['REQUEST_TIME']}" ); if ( ( $_SESSION['LOGGED'] ?? 0 ) === TRUE && SQL::P( 'SELECT SID FROM SESSREM WHERE UID = ?', [ $_SESSION['ID'] ] ) -> fetchColumn() == $_COOKIE['AuthMe'] ) { self::$UID = $_SESSION['ID']; self::$USERNAME = $_SESSION['USERNAME']; self::$GROUP_TITLE = $_SESSION['NAME']; self::$GROUP_ACCESS = $_SESSION['ACCESS']; self::$GROUP_COLOR = $_SESSION['COLOR']; self::$USER_LOGGED_IN = $_SESSION['LOGGED']; } elseif ( filter_input ( INPUT_COOKIE, 'AuthMe', FILTER_DEFAULT, [ 'options' => [ 'regexp' => '/^[a-f0-9]{32}$/' ] ] ) ) { $SQL = 'SELECT U.ID, U.USERNAME, U.PASSWORD, G.NAME, G.ACCESS, G.COLOR, B.ID AS BAN FROM SESSREM S LEFT JOIN USRACCOUNT U ON U.ID = S.UID LEFT JOIN GROUP_USER G ON G.ID = U.STATUS LEFT JOIN USRBANNED B ON B.UID = U.ID WHERE S.SID = ?'; $PDO = SQL::P( $SQL, [ $_COOKIE['AuthMe'] ] ); if ( $PDO -> rowCount() > 0 ) { $U = $PDO -> fetch(); if ( $U['BAN'] !== NULL ) { self::$USER_BANNED_IN = TRUE; setcookie ( 'AuthMe', '', -1 ); } elseif ( md5 ( $U['ID'] . $U['USERNAME'] . $U['PASSWORD'] ) == $_COOKIE['AuthMe'] ) { self::$UID = $_SESSION['ID'] = $U['ID']; self::$USERNAME = $_SESSION['USERNAME'] = $U['USERNAME']; self::$GROUP_TITLE = $_SESSION['NAME'] = $U['NAME']; self::$GROUP_ACCESS = $_SESSION['ACCESS'] = $U['ACCESS']; self::$GROUP_COLOR = $_SESSION['COLOR'] = $U['COLOR']; self::$USER_LOGGED_IN = $_SESSION['LOGGED'] = TRUE; SQL::P( 'UPDATE SESSREM SET TIMEOUT = ? WHERE SID = ?', [ strtotime ( self::$RAY['RAY']['AUTHME']['LIMIT'] ), $_COOKIE['AuthMe'] ] ); SQL::P( 'UPDATE USRACCOUNT SET LASTONLINE = ? WHERE ID = ?', [ $_SERVER['REQUEST_TIME'], self::$UID ] ); setcookie ( 'AuthMe', $_COOKIE['AuthMe'], strtotime ( self::$RAY['RAY']['AUTHME']['LIMIT'] ), '/' ); } else { # передать сообщение с ip о левой куки с попыткой обхода. } } else { if ( isset ( $_COOKIE['AuthMe'] ) ) { setcookie ( 'AuthMe', '', -1 ); } } } } } --- Добавлено --- Данные скрипты день назад хотел еще залить на форум для обсуждения / до ума доделать. Но мол стремно - помидоры не люблю.
каждая ошибка содержит свой ключ username email password данные передаются в json формате. Js код отправил данные на сервер и получил ответ в виде json текста код(отрывок) дальнейшего парсинга был что-то подобного этого: Код (Javascript): dataType: 'JSON', success: function ( json ) { if ( json.ELEMENTS.REDIRECT != undefined ) { window.location.href = json.ELEMENTS.REDIRECT; } if ( json.ELEMENTS.MSGERROR != undefined ) { $( '.errorPanel' ).remove(); $( '.RAY_WRAPPER_REGISTER' ).prepend( '<div class="errorPanel"></div>' ); i = 1; $.each( json.ELEMENTS.MSGERROR, function ( index, value ) { $( '.errorPanel' ).append( '<p>' + i++ + ') ' + value + '</p>' ); }); } }