我应该如何解决这个问题?$_GET中的符号


How should I fix this? Symbols in $_GET

对于我的电子邮件确认脚本,我通过现有的单向加密函数运行用户的电子邮件地址,然后从其中获取20个字符,从而生成一个令牌。我从用户那里获得令牌,作为$_get变量或$_POST变量。我遇到了一个"错误",当输入一个带有加号(+)的电子邮件地址,然后从用户那里检索出该令牌作为$_GET变量时,加号会被转换为空格,哈希也会发生变化,因此令牌不再匹配。

所以,我想知道解决这个问题的最佳方法是什么?逃离加号?转换加号?URL编码?当我使用$_GET时,还会发生其他哪些字符?

以下是相关代码,以防有帮助:

<?php
if (isset ($_GET['email'], $_GET['token'])) {
    $email = strtolower (mysql_real_escape_string($_GET['email']));
    $token = mysql_real_escape_string($_GET['token']);
    $correctToken = substr (doEncrypt ($email), -26, -6);
}elseif (isset ($_POST['submit'])) {
    $email = strtolower (mysql_real_escape_string($_POST['email']));
    $token = mysql_real_escape_string($_POST['token']);
    $correctToken = substr (doEncrypt ($email), -26, -6);
}
if (isset ($email, $token, $correctToken)){    
    if ($token == $correctToken) {
        // Confirm user's email!
    }
}
?>

非常感谢!Billy

编辑:好吧,现在最大的问题是,加号是通过$_GET检索时唯一转换为空格的字符吗?如果是的话,那么我似乎可以在$_GET部分添加这个:$email = str_replace(' ', '+', $email);电子邮件地址中没有其他空间的原因,对吧?

再次感谢,Billy

如果是我,我会在散列之前执行str_replace()将加号转换为空格。将str_replace()放入哈希函数中;这样,用户的电子邮件地址只在函数的范围内进行修改,并且在脚本的其余部分保持不变。

function hash_email($email)
{
  $email = str_replace('+', ' ', $email);
  ...hashing stuff happens here...
  return $token;
}
$token = hash_email($_GET['email']);