我還沒有爲自己的編碼這個,但我會接近這樣的問題:當用戶提出了一個cookie
創建可用於強制有效性檢查表持久性:
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);
}
這段代碼所做的是檢查用戶是否已經檢查過記住我,並且它爲用戶填充了一個鍵,一個令牌和一個鹽以及一個時間(以便您可以對記憶執行時間限制我的特色)。
從這裏您可以將代碼添加到您的網站如果餅乾怪獸 Cookie設置,檢查和如果是你可以按照以下步驟來加強其有效性:
提取用戶ID和來自cookie的密鑰
用userID查詢數據庫以查看是否
--> 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()函數調用運行令牌和salt,並與提供的密鑰 進行匹配。
如果一切正常,創建一個新的會話和用戶登錄。
現在每個用戶來到你的網站,他們也將登錄時間,並且在事件那他們的電腦遭到入侵攻擊者將無法訪問他們的密碼
邊注意:您應該始終要求您的用戶在更改密碼或電子郵件時提供密碼,這種方式應該是用戶的cookie找到錯誤的方式哈您的攻擊者將無法竊取該帳戶。
你有什麼擔心? – 2013-03-16 21:00:01
記住我的曲奇並沒有真正的魔力;設想一下,設想一下新建一個隨機密碼。將其存儲在數據庫中,並且每當用戶發送cookie時,都使用它來登錄它們,而不是真正的用戶名和密碼。當它到期時(每個cookie過期,有時候如果長時間不使用,有時在一年後,有時候當用戶明確註銷時),將其從數據庫中刪除。 – Dave 2013-03-16 21:00:04