註冊過程
用戶填寫表單的在線基本資料,包括電子郵件和密碼,表單提交給register.php
register.php
增加了用戶信息到一個臨時位置,例如pending_users
表,其中具有用戶提交的所有字段以及expiration
和activation_code
字段。這個代碼可以是任何隨機的,不可能猜到價值。例如:hash('sha1', mt_rand(10000,99999).md_rand(10000,99999))
。只是不要做任何預測的,如哈希當前時間,或用戶名
register.php
將電子郵件發送到用戶的方式將鏈接到activate.php
和包括激活碼的URL。例如:example.com/activate.php?code=a2ef24...
電子郵件也應告知過期的用戶(1〜12小時的有效性似乎確定我)
當用戶點擊鏈接時,她觸發GET
請求activate.php
。在此過程中,用戶證明了電子郵件地址的所有權
activate.php
從請求參數獲取代碼,例如:$code=$_GET['code']
。使用該代碼,腳本將查詢pending_users
表以查找與該代碼匹配的記錄。
如果找到該代碼,請在繼續之前檢查它是否過期。到期會阻止其他更晚進入用戶帳戶的人完成註冊。
如果代碼有效,從匹配記錄中捕獲用戶詳細信息並從pending_users
表中刪除該記錄。
在常規users
表中填寫匹配記錄。在此之前,用戶無法登錄,因爲登錄腳本僅檢查users
表,並忽略pending_users
表。
註冊完成。
安全提示我:
對用戶的保護,從來沒有存儲明文密碼。當您從登記表接受它(例如:$_POST['pwd']
,做到:
$pwd = $_POST['pwd'];
//first validate; it should meet minimum requirements
$pwd_hash = password_hash($pwd, PASSWORD_DEFAULT); // <- the hash gets stored
後來,驗證密碼,這樣做:
password_verify($cleartext_pwd, $pwd_hash);
它將返回true
如果密碼是正確的; false
否則。
安全注意事項二:
爲了您PROT 從不直接在用戶數據庫查詢中插入用戶提供的值。這意味着任何值從外部到達。不僅僅是用戶名,電子郵件,密碼......還包括您從用戶處取回的值,如上面的activation_code
或cookie值或標頭(例如User-Agent)。相反,學會使用準備好的語句。這將保護你免受SQL注入。
http://stackoverflow.com/questions/2088969/generating-confirmation-code-for-an-email-confirmation訪問此 –
非常好的問題。您可以像我在下面的回答中那樣簡單地將鏈接構建爲「example.com/activate.php?code=a2ef24 ...」。按照您看到的格式化的URL被重寫爲使用'.htaccess'規則在幕後看起來就像那樣。 – BeetleJuice