2011-12-28 136 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与预处理语句。