Php 电子邮件验证码-是否为uniqid?

Php 电子邮件验证码-是否为uniqid?,php,mysql,pdo,Php,Mysql,Pdo,因此,我正在编写一个简单的用户系统,希望用户验证他们的电子邮件地址(就像几乎所有其他网站一样)。您认为生成该字符串并用于验证用户的最佳方法是什么 起初我以为我只会使用uniqid(),但当我更多地考虑它时,我应该记住什么类型的安全问题 另外,我正在使用PDO w/prepare(MySQL);对于我的数据库操作,我还应该做什么消毒呢?对于用户来说,最好的解决方案是不使用电子邮件验证。这是一项非常古老且枯燥的技术(许多用户使用10分钟邮件)。您希望能够生成一个足够难在外部复制的字符串。例如,用户电

因此,我正在编写一个简单的用户系统,希望用户验证他们的电子邮件地址(就像几乎所有其他网站一样)。您认为生成该字符串并用于验证用户的最佳方法是什么

起初我以为我只会使用
uniqid()
,但当我更多地考虑它时,我应该记住什么类型的安全问题


另外,我正在使用PDO w/prepare(MySQL);对于我的数据库操作,我还应该做什么消毒呢?

对于用户来说,最好的解决方案是不使用电子邮件验证。这是一项非常古老且枯燥的技术(许多用户使用10分钟邮件)。

您希望能够生成一个足够难在外部复制的字符串。例如,用户电子邮件地址的简单SHA1散列很容易复制,并不合适

不过,由于散列函数的工作方式,您可以随时插入一个“秘密”,这样就足够了。例如,生成一个用于此目的的长随机字符串常量,并将其附加到用户的电子邮件地址,然后对其进行散列。您还可以生成随机字符串作为验证令牌

无论使用何种方法,请确保将发送给用户的验证令牌记录在用户记录的一列中,并在该列上为表编制索引,以便快速检索。稍后您将执行以下操作:

SELECT * FROM users WHERE verification_token=?

如果您可以找到与该令牌匹配的条目,您知道它是有效用户,并且可以将它们标记为已验证。

我会使用
md5(microtime())
生成唯一哈希,然后您只需将哈希存储在varchar type中的某个位置column@serg:这不是唯一的。这是不可能的,但完全可能的,2+点击进来,并得到相同的微时间。最好是对其他保证的唯一值进行散列。用户的电子邮件地址、数据库记录主键、各种salting值等等blah@MarcB是的,我正在考虑对他们的电子邮件进行哈希处理。在使用PDO时,我还应该做什么消毒呢?@Serg不仅不能保证唯一性,而且是可预测的。如果攻击者想要确认自己是否拥有自己不拥有的电子邮件地址,则可以尝试使用一小组值。请记住,大多数服务器使用ntp,并且时间几乎可以肯定精确到50毫秒以内(可能是10秒)。可以预测,绝对同意。最好是散列电子邮件+一些秘密字符串(或其他独特的组合字符串的方式),我喜欢你指出这一点的方式,然后不详细说明替代方法。这就像说不要买XXX,有更好的;与此同时,与你交谈的人只是坐在那里等待。。。。