Domanda

Sono un principiante a lavorare su uno script di accesso in PHP. Questa è la dichiarazione di token forma che ho finora:

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

La dichiarazione è rilasciata solo dopo che l'utente indica che lui / lei vuole fare il login.

La mia comprensione limitata è che lo scopo token è quello di identificare un utente unico in un unico punto nel tempo e per mascherare il modulo di informazioni sul token.

Poi tutto diventa sfocata. Qui ci sono i miei 3 domande aperte:

  1. Quando è il momento migliore per "check" la forma di token per motivi di sicurezza?

  2. Come faccio a verificare che?

  3. Quando, se mai, faccio "distruggere" la forma di token? (IOW, avrebbe la forma di token rimanere "attivo" fino a quando l'utente si disconnette?

È stato utile?

Soluzione

Non c'è bisogno di fare ciò che si sta tentando. Quando si avvia una sessione in PHP con session_start () un SESSIONID unica è già generato per voi. Si dovrebbe non essere messa sul modulo. Esso è gestito tramite i cookie per impostazione predefinita. C'è anche bisogno di controllare la SESSIONID sia, che ancora una volta viene gestito per voi.

L'utente è responsabile per l'autenticazione dell'utente e la conservazione della loro identità autenticata (ad esempio $ _SESSION [ 'user_id'] = $ userId nella sessione. Se un utente si disconnette si distrugge la loro sessione con session_destroy.

È necessario assicurarsi session_start () è uno dei prima cose per tutte le pagine del sito.

Ecco un esempio di 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: ho frainteso la domanda iniziale. Ho aggiunto ai metodi sopra per generare e convalidare hash forma;

Si prega di vedere le seguenti risorse:

Altri suggerimenti

questo è quello di prevenire gli attacchi CSRF

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

un sito malintenzionato potrebbe teoricamente visualizzare un modulo che i posti per l'applicazione. il modulo può contenere istruzioni che causano una violazione dei dati o una certa azione indesiderata. l'utente potrebbe essere ingannato l'invio del modulo che l'applicazione avrebbe accettato perché l'utente è già connesso. una forma di token assicura che il modulo è stato creato dal tuo sito e non qualche altro sito.

verifica della HTTP_REFERER spesso è abbastanza buono, ma non come completa una soluzione (https per esempio non inviare la stringa di provenienza).

se si vuole veramente per garantire tutte le forme con un token, è possibile creare alcune funzioni di convenienza come emitToken () e checkToken () che renderanno il lavoro a livello di sito.

alcuni esempi:

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

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

Si potrebbe verificare l'attuazione Zend Framework.

Oltre realizzazione specifica, i documenti descrivono il ragionamento e l'utilizzo di questo tipo di elemento in un modulo.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top