W3docs

uniqid()

Panoramica della funzione PHP uniqid(): sintassi, parametri, valore restituito e quando non usarla per la sicurezza.

La funzione PHP uniqid() genera un ID stringa derivato dal tempo corrente in microsecondi. Questa pagina ne illustra la sintassi e i parametri, l'aspetto del valore restituito, l'importante avvertenza che non è adatta ai token di sicurezza e le alternative consigliate.

Cosa fa uniqid()

uniqid() restituisce una stringa esadecimale di 13 caratteri basata sul tempo di sistema corrente, misurato fino al microsecondo. Poiché il clock avanza continuamente, due chiamate effettuate anche a distanza di una frazione di secondo di solito producono valori diversi, rendendo la funzione utile per identificatori a basso rischio come nomi di file temporanei, chiavi di cache o ID di elementi DOM.

Si tratta di un identificatore basato sul tempo, non casuale. Questa distinzione è importante: il valore è prevedibile e su una macchina veloce due chiamate nello stesso microsecondo restituiscono la stessa stringa. Tienilo presente prima di fare affidamento su di esso per l'unicità — e mai per la segretezza.

Sintassi

uniqid(string $prefix = "", bool $more_entropy = false): string
ParametroTipoDescrizione
$prefixstringTesto anteposto all'ID restituito. Utile quando più host o processi potrebbero generare ID nello stesso istante. Il valore predefinito è una stringa vuota.
$more_entropyboolSe true, aggiunge caratteri extra che rendono il risultato meno soggetto a collisioni. Il valore predefinito è false.

Valore restituito: una stringa. Con gli argomenti predefiniti è lunga 13 caratteri; con $more_entropy impostato a true è lunga 23 caratteri (la lunghezza del prefisso si aggiunge in entrambi i casi).

Utilizzo di base

Chiama uniqid() senza argomenti per ottenere un ID grezzo basato sul timestamp:

php— editable, runs on the server

L'$id restituito è composto da 13 caratteri esadecimali. Ogni esecuzione stampa un valore diverso perché il timestamp sottostante in microsecondi è avanzato.

Aggiungere un prefisso

Passa una stringa come primo argomento per anteporla all'ID. Questo aiuta a distinguere gli ID generati in parti diverse dell'applicazione o su server diversi:

php— editable, runs on the server

Il prefisso non è casuale — viene aggiunto letteralmente — quindi da solo non aumenta l'unicità. Il suo scopo è denominare l'ID in un namespace.

Maggiore entropia

In un ciclo intenso, il timestamp può ripetersi e si possono ottenere ID duplicati. Impostando il secondo argomento a true vengono aggiunti caratteri extra (basati su un generatore congruenziale lineare combinato) per ridurre tale rischio:

php— editable, runs on the server

Con $more_entropy abilitato il risultato è lungo 23 caratteri. Questo riduce la probabilità di collisioni ma non rende il valore imprevedibile.

Importante: uniqid() non è sicura

Questo è l'errore più comune con uniqid(). Poiché il valore è derivato dall'orologio, un attaccante che sa approssimativamente quando è stato creato un ID può indovinarlo. Non usare mai uniqid() per:

  • token di reimpostazione della password o token "magic link"
  • identificatori di sessione o chiavi API
  • token CSRF o qualsiasi altro valore sensibile alla sicurezza

Per qualsiasi cosa che debba essere imprevedibile, usa una sorgente crittograficamente sicura. random_bytes() (PHP 7+) è lo strumento giusto, eventualmente convertito in una stringa leggibile con bin2hex():

<?php
// 32-character, cryptographically secure random token
$token = bin2hex(random_bytes(16));
echo "Secure token: " . $token . "\n";
// e.g. Secure token: 93261fb1d3d843e8dac1d3372b4f3306
?>

Se hai bisogno di un identificatore univoco globale in un formato standard, un UUID (tramite una libreria come ramsey/uuid) è solitamente più adatto di uniqid().

Quando usare uniqid()

uniqid() è una buona scelta quando hai bisogno di un'etichetta rapida e usa-e-getta e un piccolo rischio di collisione è accettabile:

  • nomi di file di upload o cache temporanei
  • attributi id HTML univoci generati lato server
  • chiavi a breve durata in cache non critiche per la sicurezza

Per segreti imprevedibili usa random_bytes(); per la casualità di uso generale vedi mt_rand() e rand(); e se hai bisogno solo del timestamp ad alta risoluzione sottostante, guarda microtime().

La funzione uniqid() produce un ID di 13 caratteri (o 23 con $more_entropy) dal timestamp del microsecondo corrente. È comoda per identificatori non sensibili con basso rischio di collisione, ma è prevedibile per progettazione — per i token di sicurezza preferisci sempre random_bytes(). Scegliere lo strumento giusto per il lavoro mantiene gli ID sia sufficientemente unici sia, dove conta, impossibili da indovinare.

Esercitazione

Pratica
Qual è la funzione di uniqid() in PHP?
Qual è la funzione di uniqid() in PHP?
Was this page helpful?