2013-07-05 56 views
2

這種鹽搞亂了我的SELECT命令:MYSQL和隨機字符搞亂它

p,ÙÕ†¤éÿ5xÃø¤ü¥-A™M> |§Éá\0yå-E

解碼輸出:

p‚ÙÕ†¤éÿ5xÃø¤ü¥–ä™m›|§Éá\0yå–e 

無鹽:

mysql> SELECT userid, username FROM user; 
+--------+--------------+ 
| userid | username  | 
+--------+--------------+ 
|  1 | user1  | 
|  2 | user2  | 
|  3 | user3  | 
|  4 | user4  | 
+--------+--------------+ 
4 rows in set (0.00 sec) 

隨着鹽:

mysql> SELECT userid, username, salt FROM user; 
+--------+--------------+----------------------------------+ 
| userid | username  | salt        | 
+--------+--------------+----------------------------------+ 
|  1 | user1  | ]ææ=°ù¡£YÒp£'Rm§Éá yåe | | 
|  3 | user2  | ¸ÀçqµgsN\ôü¥ä 
ɪÓñ1r¦ôyr$ÅK | 
|  4 | user4  | \7øþ ÇãÙr|ú&eå¡%» 
              yYRìÚ¬E | 
+--------+--------------+----------------------------------+ 
4 rows in set (0.00 sec) 

功能我使用用於獲取生成的我的鹽:

$鹽= mcrypt_create_iv(32,MCRYPT_DEV_RANDOM);

與逃生它:

$鹽= mysql_real_escape_string($鹽);

問題:選擇'鹽'時從不顯示用戶2的行。爲什麼? 相關問題: User3也有換行符,它有點搞亂我的表,可能與上面相同的問題。

我都試過,沒有運氣: 我用Google搜索與它的「MySQL的」結束每個單詞。我沒有找到任何東西..

謝謝。

+1

鹽是二進制數據,並不打算輸出到終端。很可能你已經有一些控制角色在那裏用userid 2刪除線了。你爲什麼要打印鹽? –

+0

@lc。我只是想知道我的註冊是否正常工作,然後我意識到在執行SELECT *時沒有user2。感謝您的回答,我會馬上檢查並嘗試用其他方式替換控制字符。 – Alice

+0

爲什麼你會有第一個二進制「鹽」值?這些幾乎總是[base64編碼](http://php.net/manual/en/function.base64-encode.php)以避免字符集問題。 – tadman

回答

1

貌似可以查詢二進制列與hex功能,它會給你一個字節十六進制表示,這將不會臨陣脫逃你的輸出:

select userid, username, hex(salt) from user; 

link to MySQL binary documentation

+0

無論如何做這個'SELECT *'?所以我得到每一列和十六進制的鹽。 – Alice

+0

'UPDATE user SET salt = HEX(salt)'將它切換爲十六進制編碼的值,或者如果您更喜歡'TO_BASE64(salt)'將使用更高效的base64編碼方法。然後你可以'SELECT *',但必須解碼應用程序中的'salt'列值。 – tadman

0

其實這在您的MySql數據庫中存儲和檢索二進制數據應該沒有問題。只要確保你爲了所需的目標系統而正確地轉義它。這意味着:

要將二進制字符串存儲在MySql數據庫中,您需要INSERT查詢。在將其添加到查詢中或使用參數化查詢之前,使用mysqli_real_escape_string()轉義二進制字符串。 BTW mysql_ *函數已被棄用,您應該切換到mysqli_ *函數或PDO。

從數據庫中讀取字符串時,將返回原始未轉義的二進制字符串。要顯示此字符串,您需要將其轉義爲HTML輸出,那麼功能htmlspecialchars()是一個不錯的選擇。

您似乎在某種類型的控制檯中給出了結果,具體取決於這是否是您自己的代碼正在運行,您可以爲此類型的輸出正確地轉義它,或者您只需要牢記所見即所得不是你得到的。 phpMyAdmin工具通過發送文本[BLOB - 32Bytes]來規避這個問題。

快速提示:如果您需要使用散列密碼的鹽,如果您使用像BCrypt這樣的算法,可以使您的生活更輕鬆。 PHP自己的實現password_hash()然後將密碼特定的salt包含在散列值本身中,然後您可以不用用戶特定的salt。