關於您的第一個問題,通常建議您在單個交易中進行檢查並插入。這取決於你使用的數據庫,但這些數據通常被稱爲UPSERT
陳述。在PLSQL它看起來有點像這樣(修改味):
CREATE FUNCTION upsert_user(emailv character varying, saltv character varying, hashv character varying, date_createdv timestamp without time zone) RETURNS void
LANGUAGE plpgsql
AS $$;
BEGIN
LOOP
-- first try to update the key
UPDATE users SET (salt, hash) = (saltv, hashv) WHERE email = emailv;
IF found THEN
RETURN;
END IF;
-- not there, so try to insert the key
-- if someone else inserts the same key concurrently,
-- we could get a unique-key failure
BEGIN
INSERT INTO users(email, salt, hash, date_created) VALUES (emailv, saltv, hashv, date_createdv);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- do nothing, and loop to try the UPDATE again
END;
END LOOP;
END;
$$;
在問候你的第二個問題,通常Secure
餅乾通過HTTPS是不夠的。我設置HttpOnly
選項,通常Path
選項也是如此。
HttpOnly
表示cookie無法通過JS(僅HTTP或HTTPS)訪問,並且Path
選項允許您指定cookie有效的路徑(在URL中)。
太棒了;非常感謝。我使用RethinkDB,它不支持upserts(只是沒有SQL語法):https://github.com/rethinkdb/rethinkdb/issues/209。感謝您回答我的第二個問題:我的理解是,我真正使用Cookie運行的唯一風險是重播攻擊,但我打算有一個合理的過期(7天)來限制這一點。只要用戶不能冒充管理員或其他用戶,我就不會過分擔心。 – elithrar
我認爲管理員用戶的失效時間短至30-60分鐘可能是一個好主意。他們可以做更多的傷害! 所以...我會得到獎金? :-)這很酷,如果你想等待更好的答案或更多的信息。 – Intermernet
(我不得不等待12個小時才能讓它出來);) – elithrar