[英]Is this safe enough for user login and verification? (PHP, MySQL, Sessions)
只是想確保我沒有錯過任何明顯的東西。 需要你的家伙專業知識。
數據庫中的用戶數據: - 密碼存儲為crypt(),其中存儲在用戶表中的salt字符串。
會話: - 當用戶正確登錄時,我在會話表中創建一個具有唯一sha256哈希會話ID的新行。 我也在那里存儲user_id,以查看哪個會話存在於哪個用戶。 - 我創建了一個cookie,我將會話ID存儲在其中。 - 當用戶通過訪問注銷功能注銷時會刪除會話。 - 會話在定義的到期時間內自動刪除(例如7天)
身份驗證: - 檢查客戶端是否有包含會話ID的cookie。 如果cookie會話ID與會話表中的會話ID匹配,則對用戶進行身份驗證。
你們有什么感想? 我還需要做些別的事情嗎?
編輯:添加了生成密碼的方法:
public function generate_salt($password) {
$cost = $this->CONFIG['user__password_encrypt_cost'];
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
// Prefix information about the hash so PHP knows how to verify it later.
// "$2a$" Means we're using the Blowfish algorithm. The following two digits are the cost parameter.
$salt = sprintf("$2a$%02d$", $cost) . $salt;
// Hash the password with the salt
$hash = crypt($password, $salt);
return array(
'salted_password' => $hash,
'salt' => $salt
);
}
使用CRYPT_SHA512加密並且鹽是安全的,但建議使用password_hash()。
不應使用帶有MD5或類似弱哈希的密碼。
會話處理過於復雜。
PHP具有會話處理功能,您可以在其中存儲cookie(它實際上自動存儲)。 在會話中,您可以添加用戶ID
$_SESSION['userid'] = $sUserIdFromDB;
如果客戶端有cookie,它將找到會話數據,您可以檢查他是否已登錄。
if (isset($_SESSION['userid'])
AND is_int($_SESSION['userid']) AND (0 < $_SESSION['userid'])) {
$oUserRow = $oDB->getByID($_SESSION['userid']);
} else {
// user is not logged in (has no valid session)
}
可以在DB中存儲會話ID,但是向DB添加另一個不需要的額外請求。 它不會增加安全性。 實際上,您會發現用戶使用數據庫方法同時從兩個不同的瀏覽器(移動和桌面,移動API)登錄的問題,因為會話ID將不同。
更重要的是: - 每個用戶都應該有不同的鹽 - 強制執行最小密碼長度(8個字符串) - 強制使用大量字符(小寫,大寫,數字,特殊字符) - 允許安全重置新密碼(不需要密碼通過電子郵件發送) - ....
“足夠安全”有點難以回答,但還有一些其他需要考慮的事項:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.