it-swarm.com.de

PHP Verwendung und Handhabung von Formulartoken

Ich bin Anfänger und arbeite an einem Anmeldeskript in PHP. Dies ist die Form-Token-Anweisung, die ich bisher habe:

$_SESSION["form_token"] = md5(Rand(time (), true)) ;

Die Anweisung wird ausgegeben, sobald der Benutzer angibt, dass er sich anmelden möchte.

Mein begrenztes Verständnis ist, dass der Zweck des Tokens darin besteht, einen eindeutigen Benutzer zu einem eindeutigen Zeitpunkt zu identifizieren und die Formular-Token-Informationen zu verschleiern.

Dann wird alles verschwommen. Hier sind meine 3 offenen Fragen:

  1. Wann ist der beste Zeitpunkt, um das Formulartoken aus Sicherheitsgründen zu "überprüfen"?

  2. Wie überprüfe ich das?

  3. Wann, wenn überhaupt, "zerstöre" ich das Formular-Token? (IOW, würde das Formulartoken "aktiv" bleiben, bis sich der Benutzer abmeldet?

17
dave

Sie müssen nicht tun, was Sie versuchen. Wenn Sie eine Sitzung in PHP mit session_start () starten, wird bereits eine eindeutige SESSIONID für Sie generiert. Sie sollten nicht dies auf das Formular setzen. Es wird standardmäßig über Cookies gehandhabt. Es ist auch nicht notwendig, die SESSIONID zu überprüfen, die erneut für Sie behandelt wird.

Sie sind dafür verantwortlich, den Benutzer zu authentifizieren und seine authentifizierte Identität zu speichern (z. B. $ _SESSION ['user_id'] = $ userId in der SESSION. Wenn sich ein Benutzer abmeldet, zerstören Sie seine Sitzung mit session_destroy.

Sie sollten sicherstellen, dass session_start () eines der first -Dinge für alle Seiten Ihrer Site ist.

Hier ist ein einfaches Beispiel:

<?php
session_start(); // starts new or resumes existing session
session_regenerate_id(true); // regenerates SESSIONID to prevent hijacking

function login($username, $password)
{
    $user = new User();
    if ($user->login($username, $password)) {
        $_SESSION['user_id'] = $user->getId();
        return true;
    }
    return false;
}

function logout()
{
    session_destroy();
}

function isLoggedIn()
{
    return isset($_SESSION['user_id']);
}

function generateFormHash($salt)
{
    $hash = md5(mt_Rand(1,1000000) . $salt);
    $_SESSION['csrf_hash'] = $hash
    return $hash;
}

function isValidFormHash($hash)
{
    return $_SESSION['csrf_hash'] === $hash;
}

Edit: Ich habe die ursprüngliche Frage falsch verstanden. Ich habe oben die relevanten Methoden zum Generieren und Validieren von Formular-Hashes hinzugefügt.

Bitte beachten Sie die folgenden Ressourcen:

13
hobodave

dies soll CSRF-Angriffe verhindern

http://en.wikipedia.org/wiki/Cross-site_request_forgery

eine böswillige Site kann theoretisch ein Formular anzeigen, das in Ihre Anwendung hochgeladen wird. Das Formular enthält möglicherweise Anweisungen, die einen Datenverstoß oder eine unerwünschte Aktion verursachen. Der Benutzer könnte getäuscht werden, das Formular zu senden, das die App akzeptieren würde, da der Benutzer bereits angemeldet ist. Ein Formulartoken stellt sicher, dass das Formular von Ihrer Site und nicht von einer anderen Site erstellt wurde.

das Prüfen des HTTP_REFERER ist oft gut genug, aber keine vollständige Lösung (https beispielsweise sendet den Referrer-String nicht).

wenn Sie wirklich alle Formulare mit einem Token sichern möchten, können Sie einige praktische Funktionen wie emitToken () und checkToken () erstellen, mit denen die Funktion auf der gesamten Website ausgeführt werden kann.

einige Beispiele:

http://phpsec.org/projects/guide/2.html

http://www.rodsdot.com/php/CSRF_Form_Protection.php

19
jspcal

Sie können sich die Implementierung des Zend Frameworks ansehen.

Abgesehen von der spezifischen Implementierung beschreiben die Dokumente die Argumentation und Verwendung dieser Art von Element in einem Formular.

Sein Zend_Form_Element_Hash https://docs.zendframework.com/zend-form/element/csrf/

0
txyoji