2013-07-05 27 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。