2013-03-16 2 views
2

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

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

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

Заранее благодарен!

+0

Каковы ваши опасения? –

+0

Нет никакой настоящей магии, чтобы помнить - я куки; просто представьте себе создание нового случайного пароля при его настройке. Храните это в базе данных и всякий раз, когда пользователь отправляет файл cookie, используйте это, чтобы регистрировать их вместо их реального имени пользователя и пароля. Когда он истекает (каждый файл cookie истекает. Иногда, если он не используется в течение длительного времени, иногда через год, иногда, когда пользователь явно выходит из системы), удалите его из базы данных. – Dave

ответ

3

Я не закодированы это для себя, но я бы подойти к проблеме так:

1. Создать таблицу, которая может быть использована, чтобы заставить проверку действительности, когда пользователь представляет печенье для настойчивость:

create table RememberMe 
(
    user_id int(10) NOT NULL, 
    user_token char(10) NOT NULL, 
    token_salt int(6) NOT NULL, 
    time  int(10) NOT NULL, 
    PRIMARY KEY (user_id), 
    CONSTRAINT nameYourConstraint 
       FOREIGN KEY (user_id) 
       REFERENCES userTableName (whatever_user_id_equals) 
) 

чтобы заполнить эту таблицу, я хотел бы добавить несколько строк кода для входа в систему, для этого примера я буду использовать псевдо-код

// userID variable has been sanitized already so 
// check if user clicked remember me 
// and if the user logged in successfully: 
if (rememberMe == checked && login() == true) 
{ 
    // random number to serve as our key: 
    randomNumber = random(99, 999999 ); 

    // convert number to hexadecimal form: 
    token = toHex((randomNumber**randomNumber)); 

    // encrypt our token using SHA1 and the randomNumber as salt 
    key = encrypt(token, randomNumber, SHA1); 

    // get the number of seconds since unix epoch: 
    // (this will be 10 digits long until approx 2030) 
    timeNow = unix_time() 

    // check to see if user is in table already: 
    sql = "SELECT user_id FROM RememberMe 
      WHERE user_id = 'userID'"; 

    // connect to database: 
    db = new DBCon(); 

    result = db->query(sql); 

     // number of rows will always be 1 if user is in table: 
     if (result->rows != 1) 
      exists = true; 
     else 
      exists = false; 

    result->free_memory(); 

     if (exists == true) 
     { 
      sql = "UPDATE RememberMe SET 
        user_id = 'userID' 
        user_token = 'token' 
        token_salt = 'randomNumber' 
        time  = 'timeNow'"; 
     } 
     else 
     { 
      sql = "INSERT INTO RememberMe 
        VALUES('userID', 'token', 'randomNumber', 'timeNow')"; 
     } 

    result = db->query(sql); 

     // the affected rows will always be 1 on success 
     if (result->affected_rows != 1) 
     { 
      print("A problem occurred.\nPlease log in again."); 
      quit(); 
     } 

    result->free_memory(); 

    // create a new cookie named cookiemonster and store the key in it: 
    // (we're not actually storing a score or birthday, its a false flag) 
    set_cookie("CookieMonster", escape("score="+ userID +"birthday="+ key); 
} 

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

Здесь вы можете добавить код на свой веб-сайт, который проверяет, если Коржика печенья установлено и если вы можете выполнить следующие действия для обеспечения его действий:

  1. экстракта идентификатор пользователя и ключ от печенья представлены

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

    --> a) user has requested to be remembered 
    
        --> b) check the time to see if they cookie is still valid 
    
        --> c) extract the token and salt from database table record 
    
  3. Запустите токен и соль через вызов функции encrypt() и сопоставьте представленный ключ.

  4. Если все проверки, создать новый сеанс и входа пользователя в систему.

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

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

+0

Мне это нравится ... Я заметил в вашем скрипте входа, все, что он сделал, это обновление маркера и всех деталей .. на самом деле он не проверял, существовал ли файл cookie раньше ... Я немного смущен что. Должно ли это быть сделано после того, как он проверяет, есть ли токен и все, что является правильным между таблицей и cookie, THEN обновляет данные до новых номеров с новым временем? Или что это делает, чего я не вижу? – kdjernigan

+1

Да, извините, я знаю, что это немного смущает, я просто пытался понять эту идею. Я сказал где-то там (я думаю!), Что некоторый код нужно добавить, чтобы проверить, установлен ли файл cookie. Это все псевдокод, чтобы его можно было портировать на любой язык. Однако большинство функций были основаны на функциях в библиотеке PHP. –

+1

Все страницы вашего сайта должны проверять файлы cookie, а не только одну страницу (любая страница, которая может быть точкой входа, по крайней мере). Если cookie установлен, возьмите идентификатор пользователя и захватите информацию из БД. Если это не так, этот код запускается, когда пользователь входит в систему. Предположим, вы хотите, чтобы функция «запомнить меня» запоминала людей в течение двух недель [это указано в вашем коде, занимая текущее время в секундах и вычитая из него время что cookie был установлен. После того, как вы выполнили вычитание, вы можете сравнить результат с лимитом.] –

2

Эта стратегия считаются наилучшей практикой: Посмотри на этой статье: http://jaspan.com/improved_persistent_login_cookie_best_practice

+0

Я ценю статью, и она def. дал мне несколько указателей. Я более или менее не был уверен, как это кодировать, но кто-то ниже дал мне пример того, как его кодировать. Могу ли я получить ваш вклад в общую концепцию кода и убедиться, что это хороший код для использования? – kdjernigan

3

Один из лучших методов для стойкого печенья я видел на сегодняшний день Barry Jaspan's:

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

Я рекомендую вам прочитать всю статью, выше суть.

Кроме того, вы захотите опубликовать эти файлы cookie только через соединение SSL и установить на нем флаги и httponly.

Поскольку это означает, что пользователь только аутентифицируется при подключении к серверу через SSL, я дополнительно устанавливаю HTTP-заголовок Strict-Transport-Security, чтобы заставить браузер всегда использовать SSL в будущем и, кроме того, простой файл cookie, такой как persistent_login_available=yes для не-SSL-соединений ,Если браузер посещает сайт по не-SSL-соединению, и сервер видит файл cookie persistent_login_available, он перенаправляет посетителя к версии SSL и аутентифицирует пользователя через безопасный файл cookie.

С помощью этого процесса вы будете настолько же безопасными, насколько это возможно. Это может быть немного сверху, для ваших нужд, но вы решаете.

+0

Я ценю статью, и она def. дал мне несколько указателей. Я более или менее не был уверен, как это кодировать, но кто-то ниже дал мне пример того, как его кодировать. Могу ли я получить ваш вклад в общую концепцию кода и убедиться, что это хороший код для использования? – kdjernigan

Смежные вопросы