2011-04-19 64 views
1

我正在編程我的第一個用戶界面,使用PHP進行登錄和帳戶管理,我在這個問題上停滯不前。當一個想法讓我想起我的設計時,我即將創建我的創建新用戶帳戶的方法。用戶對象和安全

這是發生了什麼事。當用戶嘗試登錄時,程序接受字符串(尚未過濾),並使用我創建的用戶類檢查提供的用戶名和密碼是否在數據庫中。如果在數據庫中找到用戶,則使用另一個類中的算法對用戶名進行加密,然後返回其憑證級別,並將這兩個值與用戶對象一起存儲在$ _SESSION變量中。還創建了另一個會話變量,它模仿存儲在對象中的憑證級別的值。如果彼此不相等,那麼會話就會被篡改。

現在在用戶類定義(方法列表)上,有一些方法允許對加密用戶名進行解碼和編碼;這讓我想起了我的問題。考慮到用戶對象是由這個類定義的,它持有這些方法來解碼和編碼用戶名,這是否會被視爲安全風險?這個班級將與用於登錄一般用戶的班級相同,因此我不確定...

+0

偏離主題,但我看到了這一點,並擔心了一下:「檢查提供的用戶名和密碼是否在數據庫中」 - 確保你不*存儲明文密碼。 – 2011-04-19 21:31:04

+0

哦,絕對不是。密碼是MD5散列。 – user716009 2011-04-19 23:01:32

回答

1

用戶名一般被視爲公共信息。

我見過限制的唯一情況是如果/當你想讓其他人限制看到你的用戶名時,

一般來說,這是您應該厭倦的密碼。

另外,在會話中,您可能希望保存用戶表的行ID而不是用戶名(這樣可以限制攻擊者知道用戶實際是誰)。這就是說,這又是一個小小的預謀。

+0

嗯,我不存儲用戶密碼的對象出於同樣的原因。我只用它作爲請求檢查。這還好吧? – user716009 2011-04-19 21:29:20

+0

我不明白你的「對象」的概念。整個概念涉及* cookies *(客戶端)和*您的數據庫*(服務器端)。在客戶端,人們通常會存儲密碼的散列(這本身就是一個完整的主題)。在服務器端,您可以將用戶名和密碼都存儲在同一個地方(數據庫)。有些人以純文本保存密碼(**非常糟糕** imho)。其他人加密密碼(**仍然不好** imho)。最好的方法是存儲散列。 – Christian 2011-04-19 21:32:46

+0

好吧, 對不起,如果我不清楚。密碼已經作爲md5散列存儲在數據庫中。也許我在想對象是錯誤的。但在我創建的用戶對象中,我可以做這樣的事情(抱歉按下輸入): 由於用戶名存儲在會話中並且用戶名已加密,所以$ _SESSION ['DAUSER'] =新用戶(用戶名,密碼,我的問題是在getDecryptUserName如果有方法在相同的類正在使用中,請使用getDecryptUserName()方法來解決這個問題。創建用戶對象是一種安全風險。 – user716009 2011-04-19 22:44:12

0

加密密碼是一種安全風險,它明顯違反了CWE-257。你應該哈希密碼,sha256是一個很好的選擇。此外,唯一需要存儲在會話中的是$_SESSION['logged_in']=True。在會話中存儲用戶名/密碼是一種非常糟糕的做法。默認會話處理程序將在/tmp/SESSION_ID中存儲此信息。

+0

偉大的鏈接,但請記住,涵蓋可恢復的格式。有一種方法可以安全地存儲密碼。也就是說,我同意一般情況下密碼應該散列。但有*密碼必須存儲在某個地方的情況(例如,由於某些原因,用戶不允許更改密碼時)。 – Christian 2011-04-19 22:53:54