5

我使用我用 rawurlencode() 编码的令牌发送用户激活的 html 电子邮件。

所以 - 链接出现在电子邮件中,如下所示:

<a href="http://site.com/auth?action=confirmActivation&amp;user=79&amp;token=zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh%5EG%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861" target="_blank">Click here to activate your account</a>

但是,当我单击此链接时,我的页面 url 如下所示:

http://site.com/auth?action=confirmActivation&user=79&token=zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh^G%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861

所以 - 之前的令牌(这是它在我的电子邮件中的显示方式):

zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh%5EG%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861

之后的令牌:

zlKoFo%22f%27g%3FtUb%27%29Z~L1%25zKh^G%23_Aj%5Ckbbbd4fdb9121b50f643f12c937ab1c03d5f09861

看起来我的浏览器在我点击时会自动进行一些转换?为什么?

4

1 回答 1

3

这是因为 %5E (^) 正在由 PHP 进行 urlencoded(它对除 -_ 之外的所有非字母字符进行编码)。这不符合 RFC。浏览器看到这一点,并通过解码所有内容“修复”编码以符合 RFC,然后仅对导致 URL 问题的字符进行编码(^ 不是其中之一)。php rawurlencode符合 RFC,但实际上,浏览器本身可能不符合 RFC,并且可能只对空格和〜等内容进行编码。我建议您只需对您获得的任何令牌进行 urldecode 并使用该结果,这将无论哪种方式都保持一致。如果令牌中有麻烦的字符,base64 对其进行编码以解决该问题。

于 2011-07-28T03:12:25.437 回答