Quando e Come generare Nonce per l'URL

0

Ho un URL con un parametro $ _GET che consente di cancellare un record nel mio database, ad es. localhost / app / delete.php? id = 4843.

La pagina delete.php controlla solo se l'utente è connesso e possiede il record db. Ovviamente, questo crea l'apertura perfetta per un attacco CSRF. Devo generare il nonce quando la pagina viene caricata, o lo faccio in qualche modo solo quando l'utente fa clic sull'URL? Come potrei?

Ecco il mio codice finora:

function nonce_create() {
   $_SESSION["nonce"] = random_bytes(12);
   $_SESSION["nonce_time"] = time();
}

function nonce_verify() {
   $time = time() - 90; /* give browser 90 seconds to load */
   if (isset($_SESSON["nonce"]) && strlen($_SESSION["nonce"]) == 7 && $_SESSION["nonce_time"] > $time) {
      $_SESSION["nonce"] = null;
   }
   else {
      header("location: index.php");
   }
}

La funzione nonce_create () sopra sarebbe chiamata quando si carica la pagina dove ci sono collegamenti alla pagina delete.php, e la funzione nonce_verify () verrebbe chiamata quando il nonce deve essere verificato e rimosso su delete.php.

    
posta John S 31.10.2017 - 17:18
fonte

1 risposta

1

Non sono sicuro di aver capito come potrebbe funzionare il tuo codice. Hai impostato un nonce nella sessione, e poi controlli che sia ancora lì? Questo sarà sempre il caso!

Il solo uso della sessione non aiuta, dal momento che la sessione viene mantenuta insieme all'aiuto di un cookie. E i cookie vengono inviati su tutte le richieste, quindi il cookie di Sesion sarà incluso nei reqeust di CSRF. Non puoi usare le sessioni da solo per dire attacchi CSRF e reqeustt legittimi a parte.

La corretta protezione CSRF richiede che il client metta da qualche parte il nonce (o il token come viene comunemente chiamato), come in un'intestazione HTTP, dove il browser delle vittime non lo includerebbe automaticamente. E poi puoi verificare che quel valore corrisponda al valore che hai memorizzato nella sessione.

Per quanto riguarda il momento in cui generare il token, direi che un token per sessione è sufficiente. Ogni volta che ricevi una richiesta da una sessione che non ha un token, generane una nuova e mantienila per la durata della sessione.

Ci sono molti dettagli su come implementarlo e non è possibile includere tutto qui. Invece, ti consiglierò di farlo:

risposta data 31.10.2017 - 17:44
fonte

Leggi altre domande sui tag