web-dev-qa-db-fra.com

PHP utilisation et manipulation des jetons de formulaire

Je suis débutant et travaille sur un script de connexion en PHP. Voici la déclaration de jeton de formulaire 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 souhaite se connecter.

Ma compréhension limitée est que le but des jetons est d'identifier un utilisateur unique à un moment unique et de dissimuler les informations de jeton de formulaire. 

Alors tout devient flou. Voici mes 3 questions ouvertes:

  1. Quel est le meilleur moment pour "vérifier" le jeton de formulaire à des fins de sécurité? 

  2. Comment puis-je le vérifier? 

  3. Quand, si jamais, est-ce que je "détruis" le jeton de formulaire? (IOW, le jeton de formulaire reste-t-il "actif" jusqu'à ce que l'utilisateur se déconnecte?

17
dave

Il n'y a pas besoin de faire ce que vous essayez. Lorsque vous démarrez une session dans PHP avec session_start (), un SESSIONID unique est déjà généré pour vous. Vous devriez not mettre ceci sur le formulaire. Il est géré via des cookies par défaut. Il n'est également pas nécessaire de vérifier le SESSIONID non plus, cela 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 la SESSION. Si un utilisateur se déconnecte, vous détruisez sa session avec session_destroy.

Vous devez vous assurer que session_start () est l’un des éléments first 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 initiale. J'ai ajouté les méthodes pertinentes ci-dessus pour générer et valider les hachages de formulaire;

S'il vous plaît voir les ressources suivantes:

13
hobodave

c'est pour prévenir les attaques CSRF

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

un site malveillant pourrait théoriquement afficher un formulaire qui sera publié dans votre application. le formulaire peut contenir des instructions provoquant une violation de données ou une action indésirable. l'utilisateur peut être trompé en soumettant le formulaire que l'application accepterait, car il est déjà connecté. un jeton de formulaire garantit que le formulaire a été créé par votre site et non par un autre site.

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

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

quelques exemples:

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

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

19
jspcal

Vous pouvez vérifier l'implémentation du framework zend.

Outre la mise en œuvre spécifique, la documentation décrit le raisonnement et l'utilisation de ce type d'élément dans un formulaire.

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

0
txyoji