2017-02-16 47 views
2

建議不要信任用戶,並在將所有輸入存儲在數據庫中之前過濾所有輸入,以避免sql注入等。在將數據存儲到數據庫之前,我應該過濾用戶密碼嗎?

用戶密碼怎麼樣?在儲存之前我應該​​進行任何消毒嗎?如果我這樣做,用戶輸入密碼登錄可能不符合已消毒的版本。

(密碼在被存儲之前被加密)。

最佳做法是什麼?

+0

**不要**將簡單的密碼存儲在數據庫中。而是用隨機鹽迭代HMAC約100ms持續時間,並用散列保存鹽。使用諸如「PBKDF2」(又名'Rfc2898DeriveBytes'),'password_hash' /'password_verify','Bcrypt'和類似函數的函數。關鍵是要讓攻擊者花費大量時間通過強力查找密碼。保護您的用戶非常重要,請使用安全的密碼方法。 – zaph

回答

3

建議不要信任用戶,並在將所有輸入存儲到數據庫之前過濾所有輸入,以避免sql注入等。

不,完全沒有。建議使用預準備語句避免SQL注入,並在顯示數據時避免通過正確轉義特殊字符來避免HTML /腳本注入。

我應該將它們存儲

之前沒有進行任何消毒的,你不應該。而且你也不應該加密密碼。您應該使用像Bcrypt這樣的強大的加密算法對它們進行哈希和散列。

+0

Bcrypt是一種安全的方法,不僅僅是一個鹽漬散列,它是一種迭代方法,需要大約100ms的計算時間 – zaph

0

我應該執行任何種類的衛生處理存儲在他們面前......

除了JB Nizet的回答相對於存儲,你應該之前過濾他們接受一個。考慮一下,Password1符合NIST的安全要求,但它也在[幾乎]每個攻擊者的前N個密碼列表中。顯然,你不希望攻擊者能夠使用他們最喜歡的密​​碼列表來對付你。

列表本身可能相當大。我見過10,000,100,000和1,000萬的大小。使用布隆過濾器可以將列表壓縮到20KB或40KB。然後,當用戶選擇密碼時,根據過濾器檢查候選密碼。 Bloom過濾器會產生一些誤報,但沒關係。只要求用戶選擇不同的密碼。

下面是一個帶有10000個密碼列表的GitHub:noloader/Password-Lists。另一個列表可在danielmiessler/SecLists。另見Peter Gutmann的Engineering Security, Chapter 6: Passwords

相關問題