2012-01-15 49 views
0

对于我的电子邮件确认脚本,我通过使用现有的单向加密功能运行用户的电子邮件地址,然后从中间抓取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);在电子邮件地址中没有其他的原因,对吧?再次

感谢, 比利

+2

是的,['urlencode'](http://php.net/urlencode)将是最合适的(在每个电子邮件发送该URL之前)。 – mario 2012-01-15 04:57:25

+0

可能重复的[PHP的加号查询](http://stackoverflow.com/questions/2671840/php-plus-sign-with-get-query) – mario 2012-01-15 05:00:27

+0

可能的重复[在PHP中提交字符串时数据库应该照顾非法字符使用htmlspecialchars()或使用正则表达式?](http://stackoverflow.com/questions/2993027/in-php-when-submitting-strings-to-the-database-应该 - 我非常重视) – 2012-01-15 05:32:28

回答

0

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

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

    ...hashing stuff happens here... 

    return $token; 
} 

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

唯一的问题是,我不得不在几个地方做这件事,然后也担心在某个时候给用户使用不正确的电子邮件。在计算正确的标记之前,将空格转换为加号是什么?我可以在'if(isset($ _GET ['email'])''部分中做到这一点?看我的编辑。感谢您的回复@njbair! – JeepFreak 2012-01-15 14:39:44

+0

修改为包含示例代码。 – njbair 2012-01-15 20:36:42

+0

完美!非常感谢! – JeepFreak 2012-01-16 17:09:44