Come generare un token casuale in php

Vorrei generare un token variabile per ogni sessione o refresh della pagina, ad esempio per inviare dati in POST o GET.

Come fare?

-

Spesso per prevenire attacchi ad esempio CSRF (Cross-site request forgery) è utile generare dei token casuali per essere inviati ad esempio tramite un POST di un form per poi confrontarlo con il token memorizzato precedentemente in una variabile di sessione es.: $SESSION['39f354ac180794708d2657269fe1e5ce'].

Cosa è un token

Nel nostro caso per token si intende un serie di caratteri o stringa alfanumerica in ordine casuale di una certa dimensione, che in PHP può essere generata da alcune funzioni integrate come ad esempio (vedi anche su php.net):

  • openssl_random_pseudo_bytes(int)
    che genera una stringa crittografica non sicura di byte pseudo-casuali installato fin dalla versione 5.3 di PHP
  • random_bytes(int) 
    che genera byte pseudo-casuali crittograficamente sicuri
  • bin2hex(stringa) 
    che converti i dati binari in esadecimale
  $mioToken = openssl_random_pseudo_bytes(16);
  echo $mioToken = bin2hex($mioToken);

// GENERA UN TOKEN: b33b07b16e9a499e5afa56c5632f1fe7
 	
 
  $mioToken2 = random_bytes(16);
  echo $mioToken2 = bin2hex($mioToken2);

// GENERA UN TOKEN: 39f354ac180794708d2657269fe1e5ce


Ci sono altre funzioni che possono essere utilizzate ma in questo caso prenderemo in esame queste appena descritte.

La funzione openssl_random_pseudo_bytes() non deve essere utilizzata per scopi crittografici essendo considerata poco sicura, anche se hanno aggiornato alcuni bug nel 2016, mentre è raccomandato per tale scopo la funzione random_bytes() essendo nativa di PHP. 7.0, ma il nostro scopo non è quello di crittografare alcun dato prezioso, a noi basta semplicemente generare una stringa casuale univoca per ogni sessione della nostra pagina per inviare un form.

Nella nostra ipotetica pagina PHP, abbiamo un form con il quale inviare dei dati ad un'altra pagina ad esempio di inserimento dati in database, dove avremo il nostro token in un campo nascosto hidden:

Pagina form.php

 <form action="alMioDB.php">
 <input type="hidden" name="mioToken" value="<?php echo $mioToken ?>">
 <input type="text" value="valoreDaInviare" name="Miovalore">
 <input type="button">
 </form>

Generare una stringa Casuale

Sempre in questa pagina andremo ad inserire la nostra funzione session_star() per memorizzare in seguito il nostro token casuale.

<?php  
session_start();
	
$mioToken = random_bytes(16);
	
$mioToken = bin2hex($mioToken);	
	
$_SESSION['mioToken'] = $mioToken;
	
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Pagina form</title>
</head>
......

In questo caso abbiamo utilizzato la funzione random_bytes(16) passando come valore interno il numero intero 16 che sarà la lunghezza in byte (32) del nostro token, è avrà come caratteri binari il valore: `['g����� ��� , trasformati poi in esadecimale dalla funzione bin2hex() =  2e5786047fe04b2ff315ab21bcfaa32c

 Non ci resta altro che intercettare il valore $_POST['mioToken'] nella pagina di destinazione e confrontarlo con la variabile di sessione $_SESSION['mioToken'] che in caso di valore diverso, si veicolerà l'utente in una direzione diversa ad  esempio in una pagina di errore personalizzato, oppure trattandosi di errori reiterati e previa memorizzazione del suo ip in un database, bannarlo dalle pagine o dal sito.

Variabile di sessione con valore Token

Pagina di destinazione form alMioDB.php:

<?php 
session_start();
		
if($_POST['mioToken'] == $_SESSION['mioToken']){
	
	
	///esegui il codice
	
}else{ 

	header("Location: pagina_errore.html");
	
}		
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Pagina destinazione</title>
</head>
......


Prova anche tu!


Php
         


Lascia un commento