Что такое относительно безопасный способ использования файла cookie для входа в систему? - PullRequest
9 голосов
/ 23 января 2011

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

Так есть ли лучший способ для "запомнить меня печенье"? IP не является хорошим вариантом, не так ли? (Некоторые машины постоянно меняют IP).

Ответы [ 3 ]

19 голосов
/ 23 января 2011

Я думаю, что нашел умное решение!

Преимущества этого (сложного?) Скрипта:

  • Когда пользователь успешно входит в систему с проверенным Запомнить меня, логинФайл cookie создается в дополнение к стандартному файлу управления сеансом. [2]
  • Файл cookie для входа в систему содержит имя пользователя, идентификатор серии и токен.Ряд и маркер - это неопровержимые случайные числа из достаточно большого пространства.Все три хранятся вместе в таблице базы данных.
  • Когда незарегистрированный пользователь посещает сайт и представляет файл cookie для входа в систему, имя пользователя, серия и токен ищутся в базе данных.
  • Если триплет присутствует, пользователь считается аутентифицированным.Использованный токен удаляется из базы данных.Создается новый токен, который сохраняется в базе данных с именем пользователя и тем же идентификатором серии, и пользователю выдается новый файл cookie для входа в систему, содержащий все три элемента.
  • Если имя пользователя и серия присутствуют, но токена нетматч, кража предполагается.Пользователь получает строго сформулированное предупреждение, и все запомненные сеансы пользователя удаляются.
  • Если имя пользователя и серии отсутствуют, cookie-файл для входа игнорируется.

У меня естьсделал таблицу в базе данных со следующей информацией:

    session | token | username | expire

Файл cookie Запомнить меня будет иметь такую ​​настройку:

    $value = "$session|$token|$userhash"; //Total length = 106
  • Session будет строкой 40(sha1) символов.
  • Token будет строкой из 32 (md5) символов.
  • Userhash в файле cookie будет строкой из 32 (md5 имени пользователя) символов.
  • Username в базе данных будет обычным именем пользователя.
  • Expire будет теперь + 60 дней.

Сценарий:

if(isset($_SESSION['check']) || $_SESSION['check']){
    //User is logged in
}else if(isset($_COOKIE['remember']) && strlen($_COOKIE['remember'])==106){
    //THERE is a cookie, which is the right length 40session+32token+32user+2'|'
    //Now lets go check it...
    conncectdb(); //Sets connection
    //How do I protect this script form harmful user input?
    $plode = explode('|',$_COOKIE['remember']);
    $session = mysql_real_escape_string($plode[0]);
    $token = mysql_real_escape_string($plode[1]);
    $userhash = mysql_real_escape_string($plode[2]);
    $result = mysql_query(" SELECT user 
                FROM tokens 
                WHERE session = '$session' 
                AND token = '$token'
                AND md5(user) = '$userhash';")
    if(mysql_num_rows($result)==1){
        //COOKIE is completely valid!
        //Make a new cookie with the same session and another token.
        $newusername = mysql_result($result,0,0);
        $newsession = $session;
        $newtoken = md5(uniqid(rand(), true));
        $newuserhash = md5($username);
        $value = "$newsession|$newtoken|$newuserhash";
        $expire = time()+4184000;
        setcookie('remember', $value, $expire, '/', 'www.example.com', isset($_SERVER["HTTPS"]), true);
        mysql_query("   UPDATE tokens 
                SET token='$newtoken', expire='$expire'
                WHERE session = '$session' 
                AND token = '$token'
                AND md5(user)='$userhash';");
        //Set-up the whole session (with user details from database) etc...
    } else if(mysql_num_rows(mysql_query("SELECT user FROM tokens WHERE session = '$session' AND md5(user) = '$userhash';"))==1)){
        //TOKEN is different, session is valid
        //This user is probably under attack
        //Put up a warning, and let the user re-validate (login)
        //Remove the whole session (also the other sessions from this user?)
    } else {
        //Cookie expired in database? Unlikely...
        //Invalid in what way?
    }
} else {
    //No cookie, rest of the script
}

Преимущества скрипта:

  • Множественный вход.Вы можете создавать новые сессии для каждого компьютера, на котором вы работаете.
  • Cookie и база данных останутся чистыми.Активные пользователи обновляют там cookie при каждом входе в систему.
  • Проверка сеанса в начале гарантирует, что база данных не получит бесполезных запросов.
  • Если злоумышленник украдет cookie, он получит новый токен, ноне новая сессияПоэтому, когда реальный пользователь посещает веб-сайт со старым (недействительным) токеном, но С действительной комбинацией пользовательского сеанса, пользователь получает предупреждение о потенциальной краже.После повторной проверки входа в систему создается новый сеанс, и сеанс, который злоумышленник удерживает, является недействительным.Повторная проверка гарантирует, что жертва действительно является жертвой, а не нападающим.

Ссылка: http://jaspan.com/improved_persistent_login_cookie_best_practice

6 голосов
/ 23 января 2011

Такая функция «запомнить меня» всегда является дополнительной угрозой безопасности.

Потому что, как и в сеансе, у вас есть только один идентификатор, который достаточен не только для идентификации пользователя ( Кто это?), но также для аутентификации этого пользователя ( Это действительно он / она? ) без выполнения реальной аутентификации.

Но в отличие от сеанса, который имеет (или должен иметь)просто короткое время жизни (в основном менее часа) и идентификатор (или должен быть) периодически изменяется (по времени и по необходимости из-за изменений состояния аутентичности / авторитета), идентификатор «запомнить меня» действителен в течение нескольких дней, если нетдаже на месяцы или годы!И этот длительный период действия представляет дополнительную угрозу безопасности.

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

Если это так, обязательнообеспечьте базовую безопасность с помощью HTTPS и установите в своих файлах cookie флаг HTTPOnly и флаг secure .Затем вы можете сделать следующее, чтобы создать такую ​​функцию «запомнить меня»:

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

  • Любой другой запрос

    1. Если естьэто не текущий сеанс, перенаправьте на страницу Запомнить меня через HTTPS, которая проверяет, есть ли файл cookie Запомнить меня .Если есть токен Запомнить меня , и он действителен, аннулируйте его, сгенерируйте новый, сохраните его в базе данных «запомнить меня», установите cookie с этим новым токеном и создайте новый сеанс с запомни меня флаг установлен.В противном случае перенаправьте на страницу входа в систему.
    2. Если текущий сеанс недействителен (обязательно используйте строгое аннулирование сеанса ), перенаправьте на страницу Запомнить меня через HTTPSесли установлен флаг Запомнить меня ;в противном случае перенаправьте на страницу входа в систему.

При этом аутентификация обеспечивается через HTTPS, как первоначальная аутентификация, так и аутентификация «Запомнить меня».И пользователь аутентичен только во время текущего сеанса;по истечении этого срока пользователь должен повторно пройти аутентификацию либо с помощью токена Запомнить меня , либо предоставив свои учетные данные для входа.И так как запомнить меня токены хранятся в базе данных, пользователь может аннулировать любой существующий запомнить меня токен.

4 голосов
/ 23 января 2011

Самые популярные способы:

  • Во многих скриптах используется какое-то отслеживание сеанса.Когда пользователь впервые посещает веб-сайт, он генерирует уникальный случайный идентификатор для пользователя и сохраняет информацию о сеансе на сервере и идентификатор в файле cookie .Затем сервер идентифицирует пользователя, используя уникальный идентификатор (называемый идентификатором сеанса). Информация, связанная с идентификатором сеанса, может видеть только сервер. PHP использует это по умолчанию,

  • Некоторые хранят пользовательские данные в самом файле cookie, нос подписью HMAC с использованием секретной строки в качестве ключа.Скрипт удаляет куки, если подпись не совпадает.Таким образом, сервер не должен хранить данные сеанса на сервере .Пользователь видит, что находится в сеансе, просматривая cookie, поэтому вам не следует хранить в нем конфиденциальные данные.Достаточно просто идентификатора пользователя (и, возможно, времени входа в систему и истечения срока действия файлов cookie). Хотя пользователь может видеть, что находится в информации о сеансе, подпись в cookie-файле гарантирует, что пользователь не сможет изменить данные сеанса сам.

Эти способы предоставляют некоторыебезопасность, что пользователь не может вмешиваться в данные сеанса, но это не защищает пользователя от перехватчика.Они всегда могут использовать анализатор пакетов и украсть сеанс из любой открытой сети WiFi.Некоторые приложения используют IP-адрес пользователя, но не имеет значения, находится ли злоумышленник в одной сети.Некоторые приложения используют User-Agent, но могут возникнуть проблемы, когда пользователь обновит свой браузер или импортирует данные из другого браузера.

Если вы действительно беспокоитесь о безопасности, тогда использует HTTPS .

Также прочитайте эту статью , особенно раздел под названием Как операторы веб-сайтов решают проблему?

...