Запоминание и проверка пользователя с помощью куки - PullRequest
1 голос
/ 11 марта 2012

Я новичок в cookie-файлах и (на самом деле, вообще-то, в PHP) и хочу внедрить систему "запомнить меня" для веб-сайта, над которым я работаю. Прочитав много постов здесь, а также на других сайтах, я понял, что не должен вводить пароль или любые другие данные пользователя в cookie. Одним из решений было использование remember_key в таблице базы данных, которая обновляется каждый раз, когда пользователь регистрируется с установленным флажком «запомнить меня». И когда пользователь снова заходит на страницу, код должен выбрать remember_key в БД и проверить, совпадает ли $_COOKIE['remember'] с remember_key, если это так, то пользователь вошел в систему. Но я не уверен, как реализовать это. Я написал некоторый код так, как мне показалось, но я мог бы использовать некоторую помощь, чтобы проверить, правильно ли то, что у меня уже есть, и как поступить. Вот что у меня сейчас:

function rememberUser($id) {

    $remember = md5(uniqid(mt_rand(),true));
    $stmt = $mysqli->prepare("UPDATE USERS SET USER_REMEMBER_KEY = ?    WHERE USER_ID = ?");
    $stmt->bind_param('si', $remember, $id);
    $stmt->execute();
    setcookie("remember", $remember, time()+60*60*24*30, "/", "www.someName.com", false, true);
}

function isValidUser($id) {

    $stmt = $mysqli->prepare("SELECT * FROM USERS WHERE USER_REMEMBER_KEY = ? AND USER_ID = ?");
    $stmt->bind_param('si', $_COOKIE['remember'], $id);
    $stmt->execute();

    $stmt->store_result();
    $count = $stmt->num_rows;

    if($count == 1) {
        return true;
    }
    else {
        return false;
    }
}

function forgetUser($id) { // not sure about this method at all!

    setcookie("remember", '', time()-3600, "/", "www.someName.com", false, true);

}

forgetUser() удалит $_COOKIE['remember'] (или его значение?), Но как он узнает, что это cookie для этого конкретного человека? Я хотел бы получить любой комментарий / предложение / совет / подсказку или что-либо еще о коде, который у меня есть сейчас, и о том, как я могу его улучшить.

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

О безопасности: мой сайт не должен быть супер-сверхбезопасным, я думаю, что этого токена будет достаточно?

1 Ответ

1 голос
/ 11 марта 2012

Я использую сеанс для защищенной части и использую либо хеш, либо user_id в куки. К cookie-файлам может получить доступ только ваш сайт. Так что, если кто-то еще не войдет в систему на том же компьютере, если у вас достаточно большой срок действия, файл cookie просто будет находиться там. Поэтому на следующей неделе, когда они возвращаются на ваш сайт и читают куки, вы просто начинаете (какой бы ни была ваша версия сеанса) с user_id или хешем, который хранится в вашей базе данных. Если хеш не совпадает, пользователь должен войти снова.

Я надеюсь, что это то, что вы были после.

Edit:

// I can't remember why right now, But I found to delete the cookie properly,
// after setcookie, I had to unset the $_COOKIE also.
setcookie("userid", "", time() - 3600);
unset($_COOKIE['userid']);
...