Utilisation et manipulation des tokens de formulaire PHP

je suis un débutant travaillant sur un script de connexion en PHP. C'est la forme de jeton de déclaration que j'ai jusqu'à présent:

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

La déclaration est émise juste après que l'utilisateur indique qu'il/elle veut se connecter.

ma compréhension limitée est que le but des tokens est d'identifier un utilisateur unique à un moment unique dans le temps et de déguiser l'information du token de forme.

alors tout devient flou. Voici mes 3 ouverts questions:

  1. quand est le meilleur moment pour "vérifier" le token de formulaire pour des raisons de sécurité?

  2. Comment puis-je vérifier?

  3. quand, si jamais, Est-ce que je "détruis" le jeton de forme? (OIE, serait la forme de jeton de rester "actif" jusqu'à ce que l'utilisateur se déconnecte?

17
demandé sur lorem monkey 2010-01-09 20:50:27

3 réponses

il n'y a pas besoin de faire ce que vous tentez. Lorsque vous démarrez une session en PHP avec session_start (), un SESSIONID unique est déjà généré pour vous. Vous devez vous mettre cela sur le formulaire. Il est géré par l'intermédiaire de cookies par défaut. Il n'est pas non plus nécessaire de vérifier le SESSIONID, qui est à nouveau géré pour vous.

Vous êtes responsable de l'authentification de l'utilisateur et du stockage de son identité authentifiée (par exemple $_SESSION ['user_id'] = $userId dans le SESSION. Si un utilisateur se déconnecte vous détruire leur session avec session_destroy.

vous devez vous assurer que session_start () est l'un des premier choses pour toutes les pages de votre site.

Voici un exemple de base:

<?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: j'ai mal compris la question d'origine. J'ai ajouté la pertinence des méthodes ci-dessus pour la génération et la validation de formulaire de hachages;

consultez les ressources suivantes:

13
répondu hobodave 2010-01-09 18:30:40

c'est pour éviter les attaques de type CSRF

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

un site malveillant pourrait théoriquement afficher un formulaire qui affiche sur votre application. le formulaire peut contenir des instructions qui causent une violation de données ou une action non désirée. l'utilisateur pourrait être trompé en soumettant le formulaire que l'application accepterait parce que l'utilisateur est déjà connecté. un jeton de forme assure que le formulaire a été créé par votre site et non un autre site.

vérifier le HTTP_REFERER est souvent suffisant, mais pas aussi complète qu'une solution (https par exemple n'enverra pas la chaîne de referrer).

si vous voulez vraiment sécuriser tous les formulaires avec un jeton, vous pouvez créer des fonctions de commodité comme emitToken() et checkToken() qui le feront fonctionner à l'échelle du site.

certains exemples:

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

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

19
répondu jspcal 2010-01-09 18:02:32

vous pouvez consulter l'implémentation du cadre zend.

outre l'implémentation spécifique, les docs décrivent le raisonnement et l'usage de ce genre d'élément sur un formulaire.

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

0
répondu txyoji 2017-09-28 19:09:34