modulo PHP utilizzo di token e la manipolazione
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:
-
Quando è il momento migliore per "check" la forma di token per motivi di sicurezza?
-
Come faccio a verificare che?
-
Quando, se mai, faccio "distruggere" la forma di token? (IOW, avrebbe la forma di token rimanere "attivo" fino a quando l'utente si disconnette?
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:
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/