2016-07-22 55 views
3

我不熟悉PHP/MySQL和電子郵件。我很確定這個問題已經被問到了,但我找不到它。所以我很抱歉,如果這是麻煩,並提前感謝你!PHP/Mail/MySQL:電子郵件確認註冊

是否有可能做到這一點用戶具有用戶被添加到數據庫之前,首先在電子郵件中的鏈接點擊的東西???

你知道怎麼樣,對於一些網站,他們有一個獨特的網絡地址,爲每個電子郵件驗證(以紅色顯示的圖片上的)?他們如何創建每個電子郵件都獨一無二的網頁?


圖片記:https://kayako.atlassian.net/wiki/download/attachments/5734920/subs-validation.png?version=1&modificationDate=1291956283000&api=v2


enter image description here

謝謝了很多的關注!如果可能的話,我寧願不要直接複製和粘貼腳本,因爲我喜歡找出自己:P但請給我一些提示,因爲我完全迷失了。

如果有任何不清楚,請告訴我,我會盡我所能來澄清!

+1

http://stackoverflow.com/questions/2088969/generating-confirmation-code-for-an-email-confirmation訪問此 –

+0

非常好的問題。您可以像我在下面的回答中那樣簡單地將鏈接構建爲「example.com/activate.php?code=a2ef24 ...」。按照您看到的格式化的URL被重寫爲使用'.htaccess'規則在幕後看起來就像那樣。 – BeetleJuice

回答

4

註冊過程

  1. 用戶填寫表單的在線基本資料,包括電子郵件和密碼,表單提交給register.php

  2. register.php增加了用戶信息到一個臨時位置,例如pending_users表,其中具有用戶提交的所有字段以及expirationactivation_code字段。這個代碼可以是任何隨機的,不可能猜到價值。例如:hash('sha1', mt_rand(10000,99999).md_rand(10000,99999))。只是不要做任何預測的,如哈希當前時間,或用戶名

  3. register.php將電子郵件發送到用戶的方式將鏈接到activate.php和包括激活碼的URL。例如:example.com/activate.php?code=a2ef24...電子郵件也應告知過期的用戶(1〜12小時的有效性似乎確定我)

  4. 當用戶點擊鏈接時,她觸發GET請求activate.php。在此過程中,用戶證明了電子郵件地址的所有權

  5. activate.php從請求參數獲取代碼,例如:$code=$_GET['code']。使用該代碼,腳本將查詢pending_users表以查找與該代碼匹配的記錄。

  6. 如果找到該代碼,請在繼續之前檢查它是否過期。到期會阻止其他更晚進入用戶帳戶的人完成註冊。

  7. 如果代碼有效,從匹配記錄中捕獲用戶詳細信息並從pending_users表中刪除該記錄。

  8. 在常規users表中填寫匹配記錄。在此之前,用戶無法登錄,因爲登錄腳本僅檢查users表,並忽略pending_users表。

  9. 註冊完成。

安全提示我:

對用戶的保護,從來沒有存儲明文密碼。當您從登記表接受它(例如:$_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注入。

+0

在我發送的電子郵件中:指向驗證頁面的鏈接是:http:// localhost:8888/Brighten/admin/signup/validation.php?salt = cd16136f697c7264 但是當我實際點擊它時,如:http:// localhost:8888/Brighten/admin/signup/validation.php?e6fc0ac809033f41 爲什麼他們擺脫我的GET功能? –

+0

沒有更多的信息,我不能說。如果我是你,我會首先確認錯誤。確保腳本實際上正在接收請求;然後執行'print_r($ _ GET)'來仔細檢查是否沒有顯示激活碼。如果確實如此,請提出一個新問題並提出相關問題。 – BeetleJuice

1

不知道是否有可能在數據庫中的驗證之後添加DATAS ...

當我想要做這樣的事情,我創建users表中的數據(或METAS用戶表),如「驗證」。 如果這個數據是「真實的」,那麼用戶已經做了驗證,他可以使用他的賬戶。如果它仍然設置爲「false」,那麼用戶不會驗證他的帳戶:他不能使用它。

有了這一點,你必須確保該帳戶是當用戶試圖登錄驗證,但它不是一個大問題^^

希望它是有用的。

+0

這是非常有用的,這是一個很好的和簡單的方法來做到這一點,非常感謝! –

1

這些不是一個獨特的網站,只有一個腳本驗證註冊完成。傳入的請求(當用戶點擊鏈接時)通過服務器端「請求重寫」全部路由到相同的腳本,以便隨機標記值可用作腳本執行的參數(參數)。

腳本的作用:如果隨機令牌值不存在於數據庫中,其中已經生成,並在用戶實際註冊之前存儲它檢查。

唯一剩下的那個腳本做的是去除確認隨機令牌和/或設置指示註冊使用實際上已經證實了他的標識(電子郵件地址)通過點擊鏈接的標誌。

簡單而直接。很難繞過,因爲你無法猜測哪些註冊用戶在沒有收到電子郵件的情況下生成了隨機令牌值。但是,考慮到攻擊腳本使用匿名電子郵件服務(一次性電子郵件地址)來接收和評估這樣的確認請求(如果攻擊者知道該過程)是微不足道的。

+0

因此,創建一個腳本,每當用戶註冊時創建一個散列值,當用戶點擊郵件上的地址時,它會帶走確認散列。 –

+0

我認爲,我用「隨機令牌」代替了「散列」,這更合適。是的,腳本通常會刪除該令牌,因爲它不再是必需的,如果令牌已在確認步驟_中正確提交,順便說一句:您可以稍後在提供「忘記密碼」功能時重新使用該數據庫列:您創建一個_new_令牌並再次將該令牌從電子郵件地址發出,以允許用戶一次登錄,以便他可以重置密碼。 – arkascha