Я не закодированы это для себя, но я бы подойти к проблеме так:
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);
}
Что делает этот код, проверьте, проверял ли пользователь меня помнить, и он заполняет таблицу базы данных ключом, токеном и солью для пользователя, а также временем (чтобы вы могли накладывать ограничения времени на запоминание я особенность).
Здесь вы можете добавить код на свой веб-сайт, который проверяет, если Коржика печенья установлено и если вы можете выполнить следующие действия для обеспечения его действий:
экстракта идентификатор пользователя и ключ от печенья представлены
запроса базы данных с идентификатором пользователя, чтобы увидеть, если
--> 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
Запустите токен и соль через вызов функции encrypt() и сопоставьте представленный ключ.
Если все проверки, создать новый сеанс и входа пользователя в систему.
Теперь каждый раз, когда пользователь приходит на ваш сайт, они будут зарегистрированы, и в том случае, их компьютер скомпрометирован, злоумышленник не будет иметь доступа к их паролю.
Сторона Примечание: вам всегда нужно, чтобы ваш пользователь вводил пароль при смене пароля или электронной почты, таким образом, если файл cookie пользователя окажется в неправильном порядке ха nds ваш злоумышленник не сможет украсть учетную запись.
Каковы ваши опасения? –
Нет никакой настоящей магии, чтобы помнить - я куки; просто представьте себе создание нового случайного пароля при его настройке. Храните это в базе данных и всякий раз, когда пользователь отправляет файл cookie, используйте это, чтобы регистрировать их вместо их реального имени пользователя и пароля. Когда он истекает (каждый файл cookie истекает. Иногда, если он не используется в течение длительного времени, иногда через год, иногда, когда пользователь явно выходит из системы), удалите его из базы данных. – Dave