Ошибка ключа формы PHP - PullRequest
       1

Ошибка ключа формы PHP

1 голос
/ 07 сентября 2010

Может кто-нибудь взглянуть на мои две функции ниже и предложить, что я могу сделать?Я создал две функции, которые в основном создают уникальный ключ, и он отображается в скрытом поле формы, а затем сразу после того, как я проверяю, была ли отправлена ​​форма, вторая функция проверяет, соответствует ли ключ в скрытом поле ключу.в сеансе.

Проблема, с которой я сталкиваюсь сейчас и снова, просто перенаправляет меня на запрещенную страницу, предлагая, чтобы ключи не совпадали, хотя я не редактировал ключ формы преднамеренно, используя мои инструменты веб-разработки Firefox.для проверки.

Я не уверен, что это проблема с кешем или нет, может кто-нибудь увидеть, есть ли что-то, что я пропускаю или могу улучшить?Это происходит только время от времени, например, если я отправляю форму несколько раз, она может просто перейти на запрещенную страницу, которая предполагает, что ключ в скрытом поле не соответствует ключу в сеансе, хотя я не вижу ничего плохого в моих двухфункции.

Вот моя первая функция, она создает уникальный ключ, который отображается в скрытом поле формы.У меня также есть ограничение по времени, в течение которого пользователь должен отправить форму, но я прокомментировал это на данный момент, потому что, кажется, это происходит чаще, когда включено.

function GenerateFormTokenHash($token)
{
    $token = $_SESSION['token'] = md5(uniqid(mt_rand(), true));
    //$token_time = $_SESSION['token_time'] = time();
    return htmlspecialchars($token);
    //return $token_time;
}

Чтобы использовать функцию выше, япросто echo GenerateFormTokenHash ($ token);в скрытом вызываемом токене.

Функция ниже используется сразу после того, как я проверяю, была ли отправлена ​​форма.

# Form Token Hash Validator
function IsValidFormTokenHash()
{
    /*global $websiteaddress;
        $token_age = time() - $_SESSION['token_time'];
        if($token_age >= 300) {
            echo 'Session Expired';
            echo 'This form has now expired. ';
            echo 'Please click here to go back to the form.';
            $_SESSION = array();
            setcookie(session_name(), '', time()-42000, '/');
            # Destroy the session
            session_destroy();
            # Generate new seesion id
            session_regenerate_id(true);
            exit;
        }*/
    if(isset($_POST['token']) && $_POST['token'] != $_SESSION['token'] || !isset($_POST['token']) || !isset($_SESSION['token']))
    {
                $_SESSION = array();
                setcookie(session_name(), '', time()-42000, '/');
                # Destroy the session
                session_destroy();
                # Generate new seesion id
                session_regenerate_id(true);
        redirect("/error/forbidden.php");
        exit;
    }
}

Опять же, эта функция находится в моем файле functions.php, поэтому после того, как ячтобы проверить, была ли отправлена ​​форма, я просто вызываю функцию следующим образом:

if(isset($_POST['submit'])) {
    IsValidFormTokenHash();
}

Так что я в основном пытаюсь понять, почему иногда время от времени он просто думает, что сеансовый ключ и ключ в скрытом поле не совпадают, может быть проблема с кешем или что я могу сделать, чтобы убедиться, что он работает нормально?

1 Ответ

3 голосов
/ 07 сентября 2010

Вероятно, вам нужно поставить круглые скобки вокруг if проверочных частей, они, вероятно, оцениваются не так, как ваша логика:

if( (isset($_POST['token']) && $_POST['token'] != $_SESSION['token']) //<-- added parenthesis around those
  || !isset($_POST['token'])
  || !isset($_SESSION['token']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...