我该怎么解决这个问题? $ _GET中的符号

时间:2012-01-15 04:51:31

标签: php get special-characters urlencode

对于我的电子邮件确认脚本,我通过现有的单向加密函数运行用户的电子邮件地址,然后从中间抓取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!
    }
}
?>

非常感谢! 比利

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

再次感谢, 比利

1 个答案:

答案 0 :(得分:0)

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

function hash_email($email)
{
  $email = str_replace('+', ' ', $email);

  ...hashing stuff happens here...

  return $token;
}

$token = hash_email($_GET['email']);