Chi lavora con il codice sa bene che nel momento in cui viene eseguito un programma l'allocazione dinamica della memoria può avvenire sia nello stack che nell'heap, quando ciò avviene nello stack la rimozione del blocco allocato può diventare un'operazione complessa per via della presenza di blocchi allocati precedentemente.
Stack trace e parametri riservati
La permanenza dei blocchi di memoria nello stack trace non è in genere un problema, ma cosa accade quando ad essere allocati sono dei dati sensibili? Gli sviluppatori di PHP hanno voluto trovare una soluzione a questo problema nella versione 8.2 con l'introduzione dell'attributo SensitiveParameter
.
Per capirne il funzionamento si osservi la seguente espressione:
function accesso(
string $username,
string $password
) {
throw new Exception('DOH! Che cosa succede?');
}
In questo caso un'informazione riservata come quella relativa alla password finirebbe nello stack trace che viene prodotto attraverso il verificarsi dell'eccezione. Ciò significa che se si usa, ad esempio, un servizio di debugging da remoto, quest'ultimo potrebbe ricevere ciò che è stato allocato nello stack, compresa una credenziale di autenticazione che dovrebbe rimanere segreta:
try {
accesso('simpson@springfield.doh', 'ciucciatiilcalzino');
} catch (Exception $exception) {
var_dump($exception->getTrace()[0]['args']);
}
L'attributo SensitiveParameter di PHP 8.2
Come evitare un'eventualità di questo genere? Sostituendo il parametro contenente l'informazione riservata tramite un attributo, in PHP 8.2 tale attributo prende appunto il nome di SensitiveParameter
.
Correggiamo quindi l'esempio proposto inizialmente in questo modo:
function Accesso(
string $username,
#[SensitiveParameter]
string $password
) {
throw new Exception('DOH! Che cosa succede?');
}
Una volta applicato l'attributo prima del parametro che deve essere nascosto all'interno dello stack trace il tentativo di stamparlo a video dovrebbe produrre un risultato come il seguente:
array(2) {
[0]=> ....
[1]=> object(SensitiveParameterValue)#2 (0) {}
}
È bene sottolineare ancora una volta il fatto che in questo modo il parametro sensibile non viene rimosso dallo stack trace ma semplicemente nascosto. Lo si può quindi recuperare in qualsiasi momento nel caso dovesse risultare utile. L'idea infatti non è quella di cancellare delle informazioni riservate ma di prevenire la loro esposizione involontaria.