Какой тип информации должен быть сохранен в Cookie (PHP)

Im, создающий класс входа / выхода, который регистрирует пользователей, устанавливает файлы cookie по выбору пользователя. Пользователь вводит свой адрес электронной почты / пароль, и он проверяет базу данных, комбинирует электронную почту / пароль, создается сеанс, а cookie установлен (с идентификатором пользователя), и пользователь перенаправляется … Затем у меня есть функция, которая регистрирует пользователей введя идентификатор пользователя, сохраненный в этом файле cookie, проверяя, существует ли этот идентификатор пользователя, а затем снова сохраняет данные пользователей в сеансе … Я задавался вопросом, может ли кто-нибудь увидеть что-либо потенциально неправильное / небезопасное.

Короткий пример, я уверен, вы, ребята, можете понять суть этого …

function login($email, $password, $remember){ // Check the database for email/password combo if(/*user exists*/){ // if the user exists $_SESSION = /*User data*/ // save the users data in a session if($remember){ setcookie('user_id', /*User id*/); // save the user id in a cookie } header("location: index.php");// redirect } } function Check_Cookie(){ if(isset($_COOKIE['user_id'])){ return $this->Log_In_ID($_COOKIE['user_id']); }else{ return false } } function Log_In_ID($id){ //Check the database if the user id exists if(/*user exists*/){ // if the user exists $_SESSION = /*User data*/ // save the users data in a session header("location: index.php");// redirect }else{ return false; } } 

Это не подробный пример того, что я пытаюсь спросить, но я уверен, что вы можете понять суть этого … Кто-нибудь видит в этом что-то потенциально неправильное. Если вы, ребята, имеете какие-либо рекомендации id, любите их слушать … также, вы, ребята, используете oop для входа в систему пользователей или любым другим способом.

    Если ваш идентификатор пользователя является порядковым номером, это довольно небезопасно, так как любой может просто изменить свой файл cookie на другой разумный номер, основанный на своих собственных (например, если у меня 1274, я мог бы попробовать другие номера в этом диапазоне) и сразу же обманывать этого пользователя.

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

    Когда пользователь входит в систему, вы создаете новый идентификатор GUID и сохраняете его с пользователем:

     UserID TokenID Expires 1274 {3F2504E0-4F89-11D3-9A0C-0305E82C3301} 9/25/2009 12:00:00 

    Когда пользователь вернется, просмотрите свой идентификатор пользователя с помощью токена, убедитесь, что токен не истек, и запишите его. Затем измените свой токен. Это защитит вас от следующего:

    • Злоумышленник не может угадать токен другого пользователя и обмануть их
    • Выдача токена нельзя обойти, игнорируя дату истечения срока действия файла cookie
    • Так как токены постоянно меняются, даже если злоумышленнику удается получить доступ к файлу пользователя, окно возможности взять на себя очень мало.

    Вы не должны доверять данным cookie. Что произойдет, если я отредактирую файл cookie и установил свой ID, чтобы сказать «1» (который, вероятно, будет административным пользователем)?

    В принципе, не делайте этого.

    Если вы хотите функцию типа «помнить меня», просто сохраните имя пользователя в файле cookie, чтобы вы могли предварительно заполнить форму входа в систему, когда пользователь вернется, – но заставит их повторно проверить подлинность.

    Файлы cookie очень легко изменяются, поэтому, если вы только сохраняете идентификатор, пользователь может его изменить. Угадывая, что они могут получить доступ к другим учетным записям и потенциально даже получить доступ администратора. Обычно я храню идентификатор вместе с токеном, когда я использую файлы cookie для аутентификации.

    Вы можете взять, например, хэш идентификатора и значение соли и сохранить его. Затем вы можете проверить токен, когда пользователь подключается. Это не идеально, и для сайта с высокой степенью защиты есть больше соображений, но для стандартного сайта это должно быть хорошим началом.

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