2011-12-28 254 views
1

我似乎無法想出在PHP中使用密碼的正確方法。我散列和使用鹽,當涉及到存儲,但我想獲得基本的口令下PHP:特殊字符密碼

stripslashes(mysql_real_escape_string($_POST["password"])); 

我假設一些用戶會使用帶「!@#$%^密碼。 ..「等 我可以想象用戶使用密碼,如<b>lulz</b>"u'mad?

如何在密碼變量中包含這些特殊字符?

+2

我不會在任何不會被重新輸出爲HTML的數據上使用反斜槓。 – 2011-12-28 19:32:09

+5

你不應該擔心這一點。你應該只用鹽和散列原始值。 – 2011-12-28 19:32:14

+2

在對它進行散列之前,您不需要對輸入執行任何操作。 – 2011-12-28 19:32:39

回答

5

你不應該在這裏做任何類型的轉義或剝離。 *就像$hashed = my_favourite_hash($_POST["password"] . $salt)應該沒問題。 任何理智的哈希函數都應該返回一串字母數字字符,而這些字符都不需要轉義。

無論如何,你應該用準備好的發言您的SQL查詢,所以沒有機會SQL注入等


*假設你沒有啓用magic quotes(你真的不該」牛逼!)。

†在此替換您的首選散列函數my_favourite_hash

+3

我猜這個子文本是爲了避開「{hash_algo}不安全!!」鍵入註釋。良好的調用:) – 2011-12-28 19:34:27

+2

stripslashes()和mysql_real_escape_string()的要點是確保你沒有傳遞任何東西給你的查詢,而這些查詢可能會被誤認爲數據以外的東西。哈希應該將您發送的任何內容轉換爲嚴格的字符串數據。 – Chris 2011-12-28 19:34:53

+1

@Madmartigan:是的,我未來的答案是... – 2011-12-28 19:35:09

3

以純文本格式存儲密碼是非常有害的。相反,您應該在數據庫中存儲該密碼的散列。如果密碼被散列,那麼它可能包含的字符沒有限制。

要創建所述散列,我會建議您使用crypt()函數。最好使用SHA512或BLOWFISH算法。

此外,我會建議您停止使用古老的mysql_*函數(它們正在被棄用),並學習如何利用PDOMySQLi與預處理語句。