对于我的电子邮件确认脚本,我通过使用现有的单向加密功能运行用户的电子邮件地址,然后从中间抓取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);
在电子邮件地址中没有其他的原因,对吧?再次
感谢, 比利
是的,['urlencode'](http://php.net/urlencode)将是最合适的(在每个电子邮件发送该URL之前)。 – mario 2012-01-15 04:57:25
可能重复的[PHP的加号查询](http://stackoverflow.com/questions/2671840/php-plus-sign-with-get-query) – mario 2012-01-15 05:00:27
可能的重复[在PHP中提交字符串时数据库应该照顾非法字符使用htmlspecialchars()或使用正则表达式?](http://stackoverflow.com/questions/2993027/in-php-when-submitting-strings-to-the-database-应该 - 我非常重视) – 2012-01-15 05:32:28