MYSQL和随机字符弄乱了它

时间:2013-07-05 17:23:48

标签: mysql select salt sqlcommand

这个盐弄乱了我的SELECT命令:

  

p,ÙÕ†¤éÿ5xÃø¤ü¥-a™米> |§Éá\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)

我用来生成盐的功能:

  

$ salt = mcrypt_create_iv(32,MCRYPT_DEV_RANDOM);

逃脱:

  

$ salt = mysql_real_escape_string($ salt);

问题:选择'salt'时,从不显示User2的行。有人为什么? 相关问题: User3也有换行符,这有点搞乱我的表,可能和上面的问题一样。

我试过没有运气: 我用Google的“mysql”结尾搜索每个单词。我什么都没发现..

感谢。

2 个答案:

答案 0 :(得分:1)

看起来您可以使用hex函数查询二进制列,它会为您提供字节的十六进制表示,这不会让您的输出变得很糟糕:

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

link to MySQL binary documentation

答案 1 :(得分:0)

实际上,在MySql数据库中存储和检索二进制数据应该没问题。只需确保为所需的目标系统正确地逃脱它。这意味着:

要将二进制字符串存储在MySql数据库中,需要INSERT查询。在将二进制字符串添加到查询之前,使用mysqli_real_escape_string()转义二进制字符串,或使用参数化查询。 BTW mysql_ *函数已弃用,您应该切换到mysqli_ *函数或PDO。

从数据库中读取字符串时,您将返回原始未转义的二进制字符串。要显示此字符串,您需要将其转义为HTML输出,然后函数htmlspecialchars()是一个不错的选择。

你似乎在某种类型的控制台中给出结果,这取决于这是否是你自己的代码运行,你可以正确地为这种类型的输出转义它,或者你只需​​要记住你所看到的是不是你得到的。 phpMyAdmin工具通过发出文本[BLOB - 32Bytes]来解决这个问题。

快速说明:如果您需要使用盐来进行散列密码,那么使用像BCrypt这样的算法可以让您的生活更轻松。然后,PHP自己的实现password_hash()将在哈希值本身中包含密码特定的盐,然后您就可以在没有用户特定的盐的情况下使用。