2012-02-15 136 views
0

我正在運行Socket.IO,並通過mysql查詢(在js中運行)確認用戶名和密碼,服務器部分工作良好。我的問題是:是否有可能將客戶端的用戶名/密碼從客戶端JavaScript安全地發送到服務器JavaScript文件?沒有用戶能夠看到密碼?密碼已經哈希(通過PHP),但我不希望他們有那裏散列可以解密。將用戶名/密碼安全地傳遞給另一個JavaScript文件

//編輯

經進一步討論後我同意它是壞的任何地方發送散列密碼,除了它駐留在腳本。是否有另一種方式來唯一標識一個用戶,並通過JavaScript傳遞這些變量,所以我的服務器js文件可以驗證它們(沒有密碼)?

+2

如果他們*解密散列,他們就會很有才華。 – alex 2012-02-15 06:18:48

+0

沒錯,我在php中使用了sha512 hash中的salt,儘管我的任何用戶都能夠知道有什麼散列在我看來構成安全風險。 – 2012-02-15 06:21:15

+0

儘管用戶知道自己的散列並不是什麼壞事(畢竟,每一個散列都用一個每個用戶都是唯一的salt),但如果這意味着要在其他地方進行身份驗證,那麼傳遞這個散列是不好的,除非您通過安全通道HTTPS傳遞它。 – Konerak 2012-02-15 06:23:12

回答

1

用戶認證完成的一種典型方式是用戶通過SSL提供用戶名/密碼。這是與服務器上的憑據進行比較(通常通過一些哈希算法,如您所描述的)。如果證書驗證,則服務器爲該用戶創建一個會話ID。會話ID臨時存儲在服務器的某個位置,並通過cookie返回給客戶端。所有後續的網絡請求都將驗證對該用戶有效的會話ID是否位於cookie中。如果是這樣,那麼它仍然是合適的用戶。

會話ID與用戶的實際憑證無關,每次用戶登錄時都應該有所不同,因此用戶憑證的會話ID沒有長期風險。相反,會話ID只是發給瀏覽器的臨時令牌,它正確提供了用戶憑據,因此服務器可以知道(在隨後的頁面請求上)這些請求來自「已登錄」用戶。

如果會話ID被盜(通過中間人窺探等),那麼具有會話ID的任何人都可以臨時訪問該帳戶。所以......如果您認爲會話ID需要受到保護,那麼您需要爲初始身份驗證和隨後使用會話ID的所有頁面訪問都要求SSL。

會話ID可以是臨時的(在一段時間後過期),並且服務器可以在任何時候通過簡單地拒絕接受它作爲已認證會話的指示而撤消它。在這方面,比使用任何真實和持久的憑證作爲重複的安全登錄指示符要簡單/安全得多。

+0

好吧,我看到你去那裏的地方。所以如果我通過JavaScript傳遞會話ID,我怎麼能去驗證反對MySQL?我想我可以爲session_id添加一個字段,並在每次用戶登錄時將其保存到數據庫中?或者有更好的方法來處理這個問題? – 2012-02-15 06:38:40

+0

@EdR - 如何將會話ID存儲在服務器上取決於您,最好的方式取決於您的應用的實現。將其存儲在數據庫中可能是最直接的處理方式。請注意,如何存儲它可能會影響對於任何給定的用戶是否有多個會話同時處於活動狀態。 – jfriend00 2012-02-15 06:45:33

+0

將它存儲在數據庫中是很好的 - 然後您將爲每個網頁瀏覽查詢您的數據庫 - 但您可能已經是。您可以使用各種類型的memcached輕鬆地將其從數據庫中移出。 – Konerak 2012-02-15 08:35:35

相關問題