编码可在codeigniter中用作URL一部分的电子邮件地址

时间:2010-11-18 16:59:15

标签: email codeigniter encoding

有没有办法对可以在codeigniter中用作网址一部分的电子邮件地址进行编码?我需要从网址解码回电子邮件地址。

我想要做的只是忘记密码恢复的事情。我发送了一个确认链接到用户的电子邮件地址,链接需要像../encodedEmail/forgottenPasswordCode(在数据库中为已提交电子邮件的用户更新了forgottenPasswordCode

当用户访问该链接时,我会对电子邮件进行解码(如果email - forgottenPasswordCode对在表中),我允许他们重置密码(我将forgottenPasswordCode重置为null)。

我可以做一个循环 - 使用select { - 或 - 设置forgottenPasswordCode列唯一的表来检查表,所以我继续生成插入失败(会更快吗?) - 直到我生成表中尚不存在的forgottenPasswordCode

但我这样做的人不会这样接受它:)。他希望用用户的电子邮件完成检查,他认为它的速度要快得多。

我正在使用codeigniter,我使用了它的encode()函数,它似乎会产生像'-slashes-'这样的字符,有时会破坏encoded-email-string。

还有其他想法吗?

3 个答案:

答案 0 :(得分:1)

尝试使用bin2hex()和hex2bin()函数,

<?php
function hex2bin($str) 
{
    $bin = "";
    $i = 0;
    do 
    {
        $bin .= chr(hexdec($str{$i}.$str{($i + 1)}));
        $i += 2;
    } while ($i < strlen($str));
    return $bin;
}

$str = 'email@website.com';

$output = bin2hex($str);
echo $output . '<br/>';

echo hex2bin($output);

?>

答案 1 :(得分:1)

不要将数据放在没有某种含义的URL中。这留下了两个选择:

  1. 将地址作为POST的一部分发送。如果它来自网络表单,那么这就是要走的路。

  2. 使用ID或散列值引用数据库中的地址。如果您需要用户点击引用其帐户的链接,请使用明确引用其帐户的内容。如果您需要引用密码重置的实例(许多系统执行此操作),请在URL中使用该哈希添加包含哈希的表。

  3. 为什么不在URL中对其进行编码?

    • 您可以看到网址(它是用户界面的一部分),编码的内容看起来很奇怪
    • 网址代表资源,应用中的内容(用户可能已拥有ID)
    • 编码的电子邮件地址很长(使这些网址更难用于电子邮件等)

    尝试在URL中保留参数以清除对Web应用程序中概念的引用(例如,通过ID或纯文本名称指向一个用户)。不适合URL的参数在POST参数中。如果必须使用URL中编码的内容,则首选单向编码和数据库查找。

答案 2 :(得分:0)

虽然使用电子邮件作为部分网址可能不是最佳设计解决方案, 使用电子邮件作为base64编码的字符串,以避免任何特殊字符的问题

E.g。 Base64编码字符串&#39; abc-def@example.com'是

YWJjLWRlZkBleGFtcGxlLmNvbQ==

在您的情况下,网址为

../YWJjLWRlZkBleGFtcGxlLmNvbQ==/forgottenPasswordCode

您只需要在使用前解码该字符串