題:
驗證電子郵件應包含什麼?
HypeWolf
2018-11-05 05:39:08 UTC
view on stackexchange narkive permalink

現在,我正在生成一個存儲在數據庫中的25個字符串,該字符串只能使用1次,並且在用戶註冊後30分鐘到期。

  http://example.com / security / activate / ZheGgUNUFAbui4QJ48Ubs9Epd  

我進行了快速數據庫查找,其邏輯如下:

如果未激活帳戶以及電子郵件未被驗證且驗證碼仍然有效,請激活帳戶,將電子郵件地址標記為已驗證,然後將驗證碼標記為已使用。

例如,每72小時就會刷新過期的郵件,並且使用的驗證碼。這是為了告訴用戶單擊的激活鏈接已過期,例如,如果他第二天查看電子郵件並嘗試使用該鏈接。

我應該在用戶名中包含用戶UUID嗎?網址?我需要添加其他內容嗎?

我曾考慮過確保在按下激活鏈接時確保註冊表中的IP地址與請求的IP地址匹配,但是對於我來說,我主要閱讀以下內容:我的手機上有這種東西,所以UX會很痛苦。

不要打擾保持/檢查IP地址。ip地址可以在短時間內更改的原因有很多-僅從一家咖啡店轉移到隔壁的咖啡店就可以做到。
除其他答案外,始終提供一種方法來表明使用給定電子郵件地址的註冊是錯誤的/不應存在。唯一可能要確認的驗證電子郵件不是很有用。 *根據個人經驗:我在匈牙利有一個非常普通的名字,我經常收到要求別人提供帳戶確認信的郵件,這些人錯誤地提供了我的地址而不是他們的地址,其中大多數人都不會被拒絕。最好的部分是當他們每週不斷“提醒”我以確認我從未做過的帳戶時。*
30分鐘有點苛刻-我可能會設法在這段時間內從這裡到達我的電子郵件,但是回到網絡的距離卻是相同的,而且我敢肯定,我無法合法地管理此回合不到50分鐘即可到達。
-1
30分鐘?為什麼?我看不到您如何完成任何工作。我希望至少有* 24小時才能激活帳戶...
我還要添加一個函數,在將URL添加到數據庫中要檢查的網站之前,確保不會兩次使用相同的字符串
的確,30分鐘太短了。您的郵件甚至可能不會在這麼短的時間內傳遞到用戶的郵箱。24小時是正常的,屆時幾乎所有人都會收到電子郵件。
順便說一句,對於代碼生成,這是通常僅生成一個隨機UUID並將其調用完成的情況之一。
這不是出於安全考慮,但請確保在途中丟失電子郵件時可以重新發送電子郵件。另外,如果登錄名基於用戶名而不是電子郵件,即使帳戶尚未通過驗證,也請允許用戶登錄並更改其電子郵件-有時您會輸入錯誤:)
六 答案:
Daisetsu
2018-11-05 05:48:25 UTC
view on stackexchange narkive permalink

如何生成包含在URL中的25個字符串?它是完全隨機的,還是基於當前時間,還是基於用戶的電子郵件?它應該是隨機的並且不可猜測。

您應確保驗證頁實際呈現(不僅僅是發生了GET請求)。諸如chrome(和防病毒程序)之類的瀏覽器通常會加載URL,而無需用戶出於安全原因而明確地單擊它們以進行預取或掃描。

這可能導致惡意行為者(夏娃)想要使用他人的電子郵件(愛麗絲)創建帳戶的情況。夏娃簽約了,愛麗絲收到了一封電子郵件。愛麗絲打開電子郵件是因為她對自己未請求的帳戶感到好奇。她的瀏覽器(或防病毒軟件)在後台請求該URL,從而無意中激活了該帳戶。

我將在頁面​​上使用JavaScript來驗證實際呈現的頁面,並在電子郵件中包含一個鏈接,用戶可以在其中報告他們未創建此帳戶。

太好了,非常感謝您的見解。該字符串確實是從NodeJS的crypto.randomBytes函數生成的,並且該應用程序已經調用了javascript函數,但並非出於您陳述的原因。這是一個徹底的答案,突出了我沒想到的事情。
我還要補充一點-如果您具有更改電子郵件功能,請確保在用戶更改其電子郵件地址時清除所有現有令牌。這樣可以防止用戶使用有效的電子郵件進行註冊,將其電子郵件更改為無效帳戶然後單擊您的註冊鏈接。
“我會在頁面上使用JavaScript來驗證實際呈現的頁面”,值得注意的是JS *可能會被用戶屏蔽*。如果是的話,那麼也許他們會在驗證該帳戶的鏈接上“思考”,但是當他們嘗試登錄時,例如下週,他們發現該帳戶已被刪除。
@vlaz是正確的,但是默認情況下阻止JavaScript的用戶經常意識到這會破壞潛在的關鍵功能。可以通過確保JavaScript可見激活帳戶的“確認”來緩解這種情況。任何禁用了JS的用戶都將看到一條消息,指出問題和解決方案。
有時頁面上有一個大按鈕“激活帳戶”。這清楚表明該帳戶尚未激活,解決了JS off問題,並允許一次在其旁邊有一個“取消請求”。
將重定向(302)返回到實際的激活控制器是否可以解決防病毒預取問題?我的意思是……他們遵循所有重定向,直到它們進入頁面嗎?
您能解釋一下為什麼“ *電子郵件中的鏈接,用戶可以報告他們沒有創建此帳戶*”的好處超過培訓用戶**從不**單擊電子郵件中沒有鏈接的鏈接的好處的原因。期待收到?
如果要保證不會意外激活電子郵件地址,請使用POST請求。最好不要讓GET請求更改服務器狀態。另請參見《末日蜘蛛》(https://thedailywtf.com/articles/The_Spider_of_Doom)。
-1
聽起來不錯。我的結論是,不應通過HTTP GET進行帳戶激活。實際上,我認為這違反了HTTP動詞語義
-1
評論不作進一步討論;此對話已[移至聊天](https://chat.stackexchange.com/rooms/85421/discussion-on-answer-by-daisetsu-what-should-a-verification-email-consist-of)。
Maros D.
2018-11-05 14:06:46 UTC
view on stackexchange narkive permalink

添加到Daisetsu的答案中(因為我還不能寫評論)。

創建表單並要求用戶創建密碼也不錯。這樣,用戶將需要輸入新密碼,並在提交新密碼後激活帳戶。它將解決後台防病毒檢查。

對於URL,只要是隨機字符串,就應該足夠。您一次擁有兩個相同內容的鍵的可能性很小。

檢查IP地址不是很好,因為某些ISP可能會輪換IP地址,因此您將阻止想要註冊但不能註冊的人。

實際上,我已經在開發的最新網站上使用了此方法。要添加此內容,您可以使用生成的所有“隨機字符串”(aka:令牌)創建數據庫。這樣,您可以保證不會重複使用密鑰。如果您將令牌用作主鍵,則MySQL返回錯誤1062,這使得驗證鍵是否存在非常容易。
@DavyM謝謝。起初,我試圖創建一個添加項,但後來又加入其中並創建了有用的答案。好像是這樣。
@IsmaelMiguel是的。如果您想確保將來不會使用該密鑰,也可以執行此操作。另外,您可以為其添加一些時間戳,以便令牌可以在一段時間後重新使用(每月刪除舊令牌)。
儘管這似乎是一個好主意,但仍然存在一個問題,即有人擁有令牌並可以重複使用它。假設用戶正在嘗試通過使用主題來查找帶有令牌的電子郵件。用戶會從其他電子郵件中記住它。並找到帶有令牌的隨機密碼重置電子郵件。用戶單擊它。由於您刪除了令牌並重新創建了新令牌,因此如果不幸的話,可能會發生該令牌實際上是給其他人的情況。然後他們更改其他人的密碼。現在他們可以使用其他帳戶訪問了。
@IsmaelMiguel您說得對。我沒有想到這一點。
Future Security
2018-11-06 02:07:46 UTC
view on stackexchange narkive permalink

您的電子郵件應包含激活碼,而不是鏈接。您不應在電子郵件中發送用於帳戶管理的任何鏈接。如果您(合法方)將電子郵件鏈接(尤其是帶有長字符串的隨機字符)鏈接到用戶,則將區分合法電子郵件與網絡釣魚嘗試變得更加困難。

激活碼應包含以下內容:可以輕鬆複製和粘貼的字符(無空格,“ +”,“-”等),也易於手動輸入。字母和數字有效。激活碼的安全性取決於它的不可預測性。就像使用cookie的會話ID一樣,您可以使用系統的安全隨機數生成器來推導該值。

激活碼應存儲在數據庫表中,每一行都有一個配置文件ID,即激活代碼 * sup>,以及到期時間。您不想將配置文件ID或有效期放在cookie,URL或激活碼中。 ** sup>惡意用戶可能篡改該ID來接管另一個帳戶。您需要在服務器端進行驗證,因為您的安全策略不能盲目地信任客戶端數據。

激活代碼應通過POST請求提交。完成其餘註冊後,自動將用戶重定向到帳戶激活URL(可以是 https://example.com/security/activate )。如果他們不小心關閉了帳戶激活頁面,可以輕鬆再次訪問該頁面。

您不希望GET請求執行任何操作。如果沒有用戶交互(由於瀏覽器預取或電子郵件安全服務),鏈接可能會被訪問。此外,在URL中放置機密可能會洩漏敏感數據。 (通過引薦標頭或瀏覽器插件。)

不用擔心IP,它仍然可能會更改。 (與用戶代理相同。)

我不知道是否需要取消功能。我什至不使用未經請求的電子郵件中的取消訂閱鏈接,因為這可能是確定是否有人與電子郵件地址相關聯的一種方法。如果激活碼足夠長,可以抵抗暴力破解,或者如果您限制激活碼的嘗試次數,那麼僅讓激活碼最終失效,我看不出有什麼害處。

另一方面可以減少不需要的帳戶激活電子郵件的數量。您可以禮貌地限制發送到某個地址的電子郵件數量。每天最多說3個,每月最多說5個。 (我不知道那是太高還是太低。)作為非用戶,我只是將您網站的電子郵件自動刪除或自動標記為已讀。

有很多不需要的激活電子郵件時要考慮的變量。最有可能與用戶體驗有關的不僅僅是安全性。您可以提供“取消我的激活,並且從不發送電子郵件到該地址,因為我永遠都不會註冊”功能,但是這樣做存在明顯的問題。 (您仍然需要驗證此人的電子郵件。)

*散列激活碼也沒有什麼壞處。像密碼一樣,散列也並不重要,因為每個代碼都只能使用一次,不包含任何私人信息,由服務器隨機生成並過期。 sub>

**您實際上可以防止使用加密MAC進行篡改,但是我強烈不建議大多數開發人員嘗試這樣做。密碼學很難正確解決。 sub>

哇<3謝謝!您會使用CD-key這樣的令牌嗎?`2ZRIF-07SWU-ZQVA7-SVSIN-OCFDC`這種類型的代碼很大,位於電子郵件中間,可通過下面的激活鏈接輕鬆了解其用途。該字符串可以使用crypto.randomBytes()生成,但我擔心的是短字母,但是如果字符串長度為25個字符,則再次出現該字符串,因此如果檢測到暴力破解,則強制使用暴力將需要一段時間。關於加密MAC的任何出色文章?:D
@HypeWolf 36並不短。36 ^ 25對我來說足夠大了。
@wizzwizz4是。也許我只是偏執。
@HypeWolf妄想症和良好的安全性不一定相關;您使用的是GET請求來觸發操作(這時,您應該轉到帶有發送POST請求以觸發操作的按鈕的頁面)。
您說:“激活碼應存儲在數據庫表中”。進一步並進行哈希處理是否有意義?由於它是一個隨機字符串,因此您可能需要使用固定鹽(否則,您需要從客戶端獲取它)。
我不同意這個答案。我們在這裡談論一次性代碼。所有各種嗅探,代理日誌文件讀取等威脅都沒有用。對於MitM攻擊,沒有任何區別。通過使過程更加複雜並且不允許使用簡單的GET,我看不到安全性的提高。
-1
@Thierry絕對。或H(固定鹽,電子郵件地址,激活碼)。但是,跳過代碼散列的風險可能很小。(我相信,因為它只能使用一次,不包含任何私人信息,是由服務器生成的,並且會過期。)當然,密碼應該*一定*進行哈希處理。
@HypeWolf字母大小並不重要。僅可能的代碼數。如果您在個人資料/驗證代碼中添加了一個計數器,並在錯誤答案過多之後使計數器無效,那麼您可以使用短得多的代碼。我什至會放棄元音以避免隨機拼寫真實單詞。將O和0視為相同,I,L和1也視為相同。刪除空格/分隔符。等等。可能的不同代碼的數量是影響安全性的唯一因素。其他任何決定都是用戶體驗問題。
@Tom您糾正了,所有這些都沒有改變。將代碼放入GET參數與將代碼放入POST參數很重要。如果您不檢查同一會話cookie,則GET可能會誤判。但是,可能有人在筆記本電腦上註冊,但在手機上閱讀了電子郵件。或者,如果cookie在註冊後但在驗證之前關閉瀏覽器,則可以清除cookie。除此之外,唯一的安全差異是您是否為網絡釣魚準備好用戶。(我們不是在談論密碼重置系統。那是非常不同的。)
可能是@IMSoP,但是無論觸發什麼,它都會變得草率。它應根據要檢查的內容使用HEAD或OPTIONS。需要考慮一些事情,主要是GET應該是冪等的,但在這種情況下不應該。
@HypeWolf我不會在其中使用帶有-連字符的安全代碼,因為當我嘗試雙擊它時,只會選擇其中一部分而不是整個數字。
@CharlieHarding確實,不錯!
您是否為最重要的帳戶管理郵件(例如電子郵件確認,密碼重置,電子郵件更改等)推薦驗證碼(而不是驗證鏈接)?
@lonix是的。對於這兩種方法,您都會生成一個隨機令牌。驗證鏈接會將該令牌放入URL。驗證碼是用戶以HTML格式輸入的令牌。我能想到的唯一針對驗證碼的風險來自為用戶方便起見而縮短令牌。如果您使用與用於URL令牌的長度相同的驗證碼長度,則驗證碼方法至少是安全的。
@FutureSecurity是的,但實際上,代碼將是一個很短的令牌(比如說6到9位數字左右),而鏈接的令牌將是一個巨大的十六進製字符串。因此,在這種情況下,您肯定會反對代碼(並贊成使用鏈接)?
@lonix不需要那麼短就可以使用。而且代碼不需要太長就可以保證安全。短鍵和短密碼不好,但是驗證令牌都不是。緩慢的在線攻擊可能會強行使用短密碼。但是與密碼不同,如果客戶端輸入錯誤的代碼太多次,令牌可能會失效。與密鑰不同,黑客無法通過將其提交給服務器來確定他們是否獲得了正確的代碼。
@lonix您可以base-32編碼一個隨機的60位數字,給您12個字符。您可以將該令牌限制為10個錯誤答案。如果要在一千年內重設他人的密碼,則每秒需要提交數百萬個猜測。沒有任何速率限製或監視。根據要保護的東西的價值,您可以添加或刪除字符以使您滿意。
-1
@FutureSecurity感謝您的見解!您已經說服我使用代碼而不是鏈接。我將在10分鐘內給用戶3次正確編寫代碼的機會,然後將其無效。
user135823
2018-11-06 14:15:12 UTC
view on stackexchange narkive permalink

對於使用安全實踐的任何事物,暴露和威脅評估都是您必須針對自己獨特的環境和用例進行評估的內容。現有的答案為該評估提供了很多接觸點,以及避免發生問題的指針-例如 GET 觸發的動作。相反,我將更多地關注UX的“用戶”部分。我還將觸及頁面上散佈的許多評論。

使用電子郵件觸發的操作“驗證”的確切原因也是要考慮的因素。如果您只是確認這是一個有效的電子郵件地址,那麼幾乎所有的操作就足夠了。驗證電子郵件,創建帳戶的意圖以及接收電子郵件的用戶是發起帳戶創建的用戶,需要付出更多的努力。

您應該不要必須採取的是發送提醒電子郵件。假設用戶有意創建了該帳戶,使用了一個有效的電子郵件地址,並希望將該帳戶用於提供帳戶的任何目的,那麼他們將尋找電子郵件,並會盡快進行激活過程。如果鏈接,代碼或任何其他內容在等待電子郵件時因其他事項而陷入歧途,則在使用它們之前可能會過期。在這種情況下,允許他們重新發送驗證電子郵件即可。但是,提醒電子郵件很可能是垃圾郵件觸發手段,而不是給用戶帶來好處。

作為用戶,我很高興有可用的選項來激活/驗證我的帳戶。我遇到的最常見的選項集是,該電子郵件提供一個鏈接,我可以單擊或剪切&粘貼,,然後可以在我的頁面中的表單字段中輸入確認代碼網站上的“帳戶設置”區域。確認碼很少是,除了5到9位數長的整數外。

作為用戶,給我最自信的驗證電子郵件是那些在URL中具有加密外觀的哈希的電子郵件( / verify?l = lgGS2SBjMTU4NjkwNjYxMjI5MDBhZDk2YjEyMzMzYzNjNhZmQxOb ),這使我對對我來說唯一的頁面,然後我必須輸入用於創建帳戶的密碼。使用哈希可以確認鏈接是在電子郵件中收到的,沒有被猜測或強行使用,因此可以驗證電子郵件是否有效。在執行任何其他操作之前,該唯一頁面的提供允許服務器將發送給它的電子郵件標記為“有效”,而無需確認帳戶的創建。與某些防病毒,惡意軟件檢測或預取操作相反,輸入密碼可確認另一端有演員。密碼的有效性在一定程度上確定了電子郵件的收件人和帳戶的創建者是同一個人。

建議的30分鐘時限確實有點嚴重,而如果威脅評估表明24小時內的暴露是不可接受的,則24小時可能會太大。我認為2個小時對幾乎所有用戶的環境都足夠。如果重新發送驗證的功能可用,則尤其如此。即使使用與遠程POP帳戶建立14 kb / s連接的移動設備,也應該能夠在120分鐘內完成交換。

使用JS來以某種方式驗證人為行為可能會出現問題。 JS可以關閉,並且比許多Web開發人員想知道的更多。其次,即使在瀏覽器中啟用了JS,廣告攔截器 仍可以基於每個站點或每個源來阻止JS。我在全球範圍內阻止了許多JS來源,包括Google的分析腳本,並為一些網站(例如Stack Exchange)添加了白名單,在這些地方我願意使用我的數據來支持它們。

在電子郵件中或確認頁面上包含“取消”帳戶的鏈接是浪費。在電子郵件中,它實際上適得其反,因為建議您單擊有關您不想要的帳戶的鏈接是一個好主意。相反,電子郵件中應包含文字說明,表示無所事事將導致帳戶無法確認,甚至可能被刪除。確認頁面上的取消鏈接甚至更糟,因為它獎勵不良行為。作為舊版Google snafu的一部分,我經常收到指向另一個Gmail帳戶的電子郵件,並且我認為相反的情況也適用於其他帳戶。 [[過去Google不會合併點綴和未點綴的用戶名,因此我的點綴用戶名和其他人的未點綴版本是不同的帳戶,但是Google偶爾會滑倒,反正我會收到他們的電子郵件:(]

您將“經過驗證”的電子郵件地址與激活鏈接緊密結合的程度取決於您的用例和威脅評估,當我在更改關聯的電子郵件地址後必須重新驗證我的帳戶時,我會感到有些煩惱。我對流程的接受程度與帳戶的“價值”成正比。對於我的銀行帳戶,PayPal等,我100%接受。但是在PcPartsPicker上,我大約接受該帳戶的15%

對於IP和/或用戶代理,請忽略它們。在這種情況下,我經常會查看站點並選擇使用移動設備創建帳戶。 strong>不是,但是可以打開電子郵件。如果我創建了一個帳戶,並得知需要以某種方式進行驗證或確認,並且電子郵件是提供的方法,我會等到我回家後,再在桌面上打開電子郵件,以便在其中檢查它。 IP和用戶代理將因此非常不同。但是,我的密碼將保持不變,並且足以驗證我作為原始帳戶創建者的身份。

請記住,電子郵件與時代廣場的Jumbo-tron一樣安全,並且相應地進行。

“確認碼很少是,除了5到9位長的整數。”這很重要。 一次性代碼會在30分鐘後過期,因此25個字符完全是多餘的。甚至6個字母數字字符都需要60萬個POST /秒,才能在30分鐘內覆蓋50%。限制驗證服務以延遲百分之一秒,並且對手最多可以掃描密鑰空間的0.008%,假設他們在整個30分鐘內都消耗了整個驗證服務,那麼他們就有12,000的機率...
@TemporalWolf您是否包括對手可以並行掃描的事實?
@PaŭloEbermann如果您限制驗證服務,那麼這將限制其可以掃描的密鑰數量。這都是關於平衡風險的。要銀行嗎?可能不會。對於小型企業?大概。當任何滑動窗口中的新帳戶數量超過100個左右時,我就會開始考慮提高。這仍然提供了小於1%的機會猜出任何人的代碼,以及100%的機會檢測到該嘗試(假設進行了一些監視)。6個字符是〜32位的熵。10是〜52。25是〜130。您可以通過驗證服務來控制蠻力速度。
Damon
2018-11-07 16:40:34 UTC
view on stackexchange narkive permalink

驗證電子郵件只需要幾件事即可,因為它們相當安全且易於使用:

  1. 用戶必須清楚發生了什麼事。被解釋為什麼會收到此電子郵件(例如“ ...某人在我們的網站上註冊了BLAH帳戶,以確認...” )排除了大多數愚蠢的錯誤,並可以合理地阻止釣魚郵件。希望您知道您是否剛剛在某項服務中註冊了帳戶(除非您完全癡呆了)。因此,收到一封說明了這一點的電子郵件就不足為奇了。另一方面,這樣的一封電子郵件知道您沒有在任何地方註冊(應該,希望)足夠可疑。如果不是這樣,並且用戶單擊通過電子郵件發送的任何隨機鏈接,則無論如何您將無能為力,也不知道您不認識的人可能會或可能不會收到哪些郵件。
  2. 將相當長的隨機(非順序!)令牌(足夠長以確保它不可猜測且不會衝突)傳遞回服務器。該令牌也存儲在數據庫中以進行比較。它到底有多長以及具有什麼特定格式都沒有關係。它不需要人類可讀。任何大於20個左右的字符(假設使用base64編碼)都可以使用,但是我會使用40個字符來確定,因為它實際上並不會花費您任何費用。 240位偽隨機字符串幾乎可以保證是唯一且不可猜測的。為了方便起見,我實際上將其設置為鏈接,而鏈接可以確實是一個 GET 請求。是的,用戶不應該單擊鏈接,但是他們還是會這麼做(您不會對其進行教育!)。另一方面,與必須複製粘貼一些晦澀的字符串相比,用戶體驗要好得多。
  3. 帶有“單擊以確認”按鈕的HTML表單,該按鈕重新對數據進行 POST ,這可以確保URL的推測性加載不會使事情發生(無意甚至惡意)擁有該郵件地址的用戶不知道。該表格應顯示合理數量的信息,以便用戶知道發生了什麼,並作為最後一次觸發“ WTF?”的機會。如果用戶沒有註冊該帳戶。
    如果您擔心使用機器人,則可以在表單中添加“我不是機器人”(個人,我認為多餘,但是您的里程可能會有所不同。)
  4. 合理的到期日期(或時間)。什麼合理沒有人能給出一個明確的普遍答案。我說從4個小時到兩天的時間可能都不錯。通常,當您註冊某件東西時,會在5到10秒鐘內收到確認郵件,然後坐在計算機前等待確認。如果您使用的是典型的偏執狂模式公司郵件,則可能會更長一些,這種公司郵件需要花費幾分鐘來掃描每一封外部電子郵件。不過,您可能會打個電話,或者必須去中間的某個地方,因此讓令牌有效期為幾個小時或一天肯定不是錯誤的。同樣,郵件 可能會被延遲(很少見,但確實會發生)。另一方面,通過保留確認令牌(並阻止帳戶名稱!)數週來浪費磁盤空間是沒有意義的。 ,幾個月或幾年。這不僅浪費資源,而且一兩天之內沒有確認的人可能永遠也不會。或者,他們可以重新註冊一次。真的,什麼都不花錢。
  5. ol>
Tom
2018-11-06 20:27:57 UTC
view on stackexchange narkive permalink

根據您的問題,我假設以下假設,如果其中任何一個無效,我的答案也是如此:

  1. 用戶在您的網頁上註冊並在此期間設置用戶名/電子郵件和密碼註冊
  2. 電子郵件驗證的目的是確保用戶已使用正確的電子郵件地址進行了註冊。
  3. 激活帳戶是唯一的目的,郵件鏈接呢。它不允許密碼重置或其他類似功能。基本上,它執行“ UPDATE用戶SET已激活= True WHERE令牌=%1”
  4. ol>

    在這種情況下,從安全角度來看,您的方法絕對正確。 25個字符可為您提供足夠的保證,以防止隨機碰撞和強力嘗試,一次性使用可防止嗅探和類似攻擊,而且無論如何,某人唯一能做的就是激活帳戶。

    您可能想要如果出於性能原因有很多用戶,請包含用戶ID。(更新:不是真的,請參見下面的註釋)通過字符串標記查找用戶將導致表掃描,而通過ID,然後僅獲取和比較字符串就是索引查找。但是,這確實會公開用戶ID,您可能會或可能不想這樣做。

“通過字符串令牌查找用戶將導致表掃描”-如果在令牌列上放置索引,則不會。文本索引可能比數字索引稍慢,但是根本沒有理由進行表掃描。
索引不是免費的。您是否會在表上放置一個索引,該索引將在每一行的生存期內“一次”使用?(同樣,對於大多數行,它都將為空。嗯,因此,它實際上可能具有一些良好的性能)
您可以為激活令牌創建一個單獨的表(帶有索引),而不是將其放入用戶表中。
為激活令牌使用單獨的表:“令牌”,“ uid”,“到期”。在使用令牌的HTTP請求中,運行`DELETE FROM TokenTable WHERE expiry
同意,@GypsySpellweaver將是一個很好的解決方案。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...