Как мне это исправить? Символы в $ _GET - PullRequest
0 голосов
/ 15 января 2012

Для моего сценария подтверждения электронной почты я генерирую токен, выполняя адрес электронной почты пользователя через мою существующую функцию одностороннего шифрования, а затем отбирая 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 голосов
/ 15 января 2012

Если бы это был я, я бы сделал str_replace(), чтобы преобразовать знаки плюс в пробелы перед хэшированием.Поместите str_replace() в функцию хеширования;таким образом, адрес электронной почты пользователя изменяется только в области действия функции и остается неизменным для остальной части сценария.

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

  ...hashing stuff happens here...

  return $token;
}

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