我有一个网站,用户必须使用典型的电子邮件确认脚本确认他们的电子邮件,该脚本包含每个用户的特定(但很长)确认链接,其中包含通常的哈希参数。
我遇到的问题是由于他们使用的设备,一些用户在长而复杂的确认链接上遇到问题。
因此,我需要创建一种替代方法,为每个用户生成唯一的确认链接,这样就不会出现明显的模式,因此无法识别和滥用。
我一直在研究Base62编码和解码,但我发现的只是基于数字,这限制了我使用顺序唯一用户ID,然后在编码结果中创建一个明显的顺序模式,容易被滥用。
最好,我想要一个不需要我改变数据库的解决方案。
理想情况下,我希望基本上创建一个缩短的URL,类似于Bit.ly和其他url缩短器创建其唯一URL的方式,但可以使用用户ID,用户名或电子邮件对其进行编码和解码,并且最好使用唯一键对编码/解码进行“腌制”,以使编码结果中不出现任何模式。
实施例
因此,而不是看起来像确认链接:
http://domain.com/confirm?email=blah@blah.com&hash=1f3870be274f6c49b3e31a0c6728957f
我希望它看起来像:
http://domain.com/confirm/Sg5rdn
然后,我只需解码Sg5rdn即可获取用户的用户名,用户ID或电子邮件并进行确认。
这可能吗?
答案 0 :(得分:1)
相反,只需创建一个包含确认码的表格。当用户进行确认时,创建一个唯一的代码(使用base62或其他),将其插入该表并将其分配给用户ID。
然后,当用户点击确认链接时,只需从确认代码表中获取用户ID等(并检查代码是否存在且仍未确认等)。
答案 1 :(得分:1)
我建议您将代码存储在用户表的列中: 示例表非常简短:
id--user---email--------------key-----confirmed----other stuff
1 bob bob@example.com 1h323f 1 ...
2 rob rob@example.com 18gg3f 0 ...
3 steve steve@example.com a862gf 1 ...
4 tom tom@example.com 17g23f 0 ...
当用户注册帐户时,请先创建密钥并将其与用户名ect
一起存储然后,当点击链接时,检查电子邮件的密钥,然后将确认更新为1。 您可以在链接上使用.htaccess使其更短:
RewriteRule ^confirm/(.*)/([a-zA-Z0-9]+)$ confirm.php?email=$1&hash=$2 [L]
例如:HTTP://domain.com/confirm/tom@example.com/17g23f
希望这有帮助
答案 2 :(得分:0)
我担心你的期望有点夸张 你唯一能做的就是缩短哈希值。
从Sg5rdn中“解码”用户名,用户ID和电子邮件的唯一方法是从数据库中获取所有这些内容。