2012-08-02 145 views
1

我下面的代碼:錯誤後INSERT INTO

$salt=uniqid(mt_rand(), false); 
#Add data to tables 
mysql_query("INSERT INTO accounts VALUES('$user', '".hash('sha512',$pass+$salt)."', '$salt', '$cookie_value')"); 
mysql_query("INSERT INTO passwordreset VALUES('$user', NULL, NULL)"); 
#cookie creation 
#..... 
#cookie update 
mysql_query("UPDATE accounts SET cookie='$cookie_value' WHERE user='$user'"); 

我從形式使用這些功能的消毒數據:

$var = htmlentities($var, ENT_QUOTES, "UTF-8"); 
return mysql_real_escape_string($var); 

今天我登錄到phpMyAdmin的和我看到的密碼和鹽對於所有用戶都是一樣的。 不要提醒我關於已棄用的mysql_ *我知道,這只是快速的草稿。

回答

3

PHP中的字符串連接使用.而不是+。因此:

hash('sha512',$pass+$salt)

應該

hash('sha512',$pass.$salt) // or 
hash('sha512',"${pass}${salt}") 
+0

聽起來很奇怪,但昨天一切都很好,它怎麼會是? – treng 2012-08-02 10:46:02

+0

也許它昨天顯得很好,並且自從獲得更多帳戶後,錯誤變得更加明顯。 – Kurt 2012-08-02 10:52:08

2

這是PHP,$pass+$salt$pass . $salt

+0

這是否會產生問題? – treng 2012-08-02 09:45:25

+0

@riwette是的,''a「+」b「'給你'0'。所以大多數值都是'hash('sha512',0)' – xdazz 2012-08-02 09:47:17

+0

聽起來很奇怪,但昨天一切都很好,結果怎麼樣? – treng 2012-08-02 10:02:45

0

此錯誤

$pass+$salt 

應該

$pass.$salt 

。用於字符串並置在PHP

1

有幾件事情我會在你當前的代碼註釋:

  1. 使用+運營商(而不是.)對兩個字符串的結果在這兩個值的總和強制轉換爲整數(如果字符串不是數字,則轉換爲int(0));當它傳遞到hash()時,它會再次轉換爲字符串,所以您的密碼通常都是sha512("0")。我不確定爲什麼您的salt都具有相同的值,除非數據庫中的列數據類型爲INT

  2. 您可以使用uniqid(mt_rand(), true)來收集更多的熵,從而產生更好的鹽。

  3. 您應該使用專用密碼哈希散列密碼,例如crypt()中的BlowFish選項(確保您的列寬足夠大)。通過這種方式,您可以擺脫salt列,並且您可以選擇需要多少工作才能以向後兼容的方式驗證散列。

  4. cookie列是用於我假設的自動登錄功能嗎?最好爲此創建一個單獨的表,其中包含隨機字符串作爲用戶表的主鍵和外鍵。這樣您可以支持從多個瀏覽器自動登錄。

+0

是否有可能爲每個blowfish哈希使用獨特的鹽?我如何檢查用戶密碼? – treng 2012-08-02 10:27:47

+0

@riwette是的,你可以添加你的'$ salt'作爲第二個參數的一部分;請仔細閱讀文檔btw :)檢查密碼是容易的; '$ hash === crypt($ password,$ hash)' – 2012-08-02 12:14:58