【问题标题】:How should I fix this? Symbols in $_GET我应该如何解决这个问题? $_GET 中的符号
【发布时间】:2012-01-15 04:51:31
【问题描述】:

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

再次感谢, 比利

【问题讨论】:

标签: php get special-characters urlencode


【解决方案1】:

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

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

  ...hashing stuff happens here...

  return $token;
}

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

【讨论】:

  • 唯一的问题是我必须在几个地方做这件事,然后还要担心在某些时候为用户使用不正确的电子邮件。在计算正确的标记之前将空格转换为加号怎么样?我只能在if (isset ($_GET['email'])) 部分执行此操作吗?请参阅我的编辑。感谢@njbair 的回复!
猜你喜欢
  • 2020-03-25
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
相关资源
最近更新 更多