2 Stimmen

PHP-Formularschlüssel-Fehler

Kann sich jemand meine beiden Funktionen unten ansehen und Vorschläge machen, was ich tun kann? Ich habe zwei Funktionen erstellt, die im Grunde einen eindeutigen Schlüssel erstellen, der in einem versteckten Feld in einem Formular wiedergegeben wird, und dann direkt, nachdem ich überprüft habe, ob das Formular übermittelt wurde, prüft die zweite Funktion, ob der Schlüssel im versteckten Feld mit dem Schlüssel in der Sitzung übereinstimmt.

Das Problem, das ich habe, ist, dass es mich hin und wieder auf die verbotene Seite umleitet, was darauf hindeutet, dass die Schlüssel nicht übereinstimmen, obwohl ich den Formularschlüssel nicht absichtlich bearbeitet habe, indem ich meine Firefox-Webentwicklungswerkzeuge zum Testen verwendet habe.

Ich bin mir nicht sicher, ob es ein Cache-Problem ist oder nicht, kann jemand sehen, ob es etwas gibt, das ich übersehe oder verbessern könnte? Es passiert nur ab und zu, zum Beispiel, wenn ich das Formular ein paar Mal abschicke, kann es dann einfach auf die verbotene Seite gehen, was darauf hindeutet, dass der Schlüssel im versteckten Feld nicht mit dem Schlüssel in der Sitzung übereinstimmt, obwohl ich nichts Falsches mit meinen beiden Funktionen sehe.

Hier ist meine erste Funktion, die einen eindeutigen Schlüssel erstellt, der in einem verborgenen Feld im Formular ausgegeben wird. Ich habe auch ein Zeitlimit, wie lange ein Benutzer hat, um das Formular zu übermitteln, aber ich habe kommentiert, dass ab jetzt, weil es scheint zu passieren, öfter, wenn aktiviert.

function GenerateFormTokenHash($token)
{
    $token = $\_SESSION\['token'\] = md5(uniqid(mt\_rand(), true));
    //$token\_time = $\_SESSION\['token\_time'\] = time();
    return htmlspecialchars($token);
    //return $token\_time;
}

Um die obige Funktion zu verwenden, echo ich einfach GenerateFormTokenHash($token); in einem versteckten namens token.

Die nachstehende Funktion wird direkt nach der Überprüfung, ob das Formular abgeschickt wurde, verwendet.

\# 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;
    }
}

Auch diese Funktion befindet sich in meiner functions.php Datei. Nachdem ich also überprüft habe, ob das Formular abgeschickt wurde, rufe ich die Funktion einfach wie folgt auf:

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

Also ich bin im Grunde versuchen, herauszufinden, warum manchmal hin und wieder es nur denkt, dass der Sitzungsschlüssel und Schlüssel in versteckten Feld nicht übereinstimmt, vielleicht ein Cache-Problem oder etwas, das ich tun kann, um sicherzustellen, dass es richtig funktioniert?

3voto

aularon Punkte 10922

Wahrscheinlich müssen Sie Ihre Angaben in Klammern setzen if Teile überprüfen, werden sie wahrscheinlich auf eine andere Weise ausgewertet, als es Ihre Logik erfordert:

if( (isset($_POST['token']) && $_POST['token'] != $_SESSION['token']) //<-- added parenthesis around those
  || !isset($_POST['token'])
  || !isset($_SESSION['token']))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X