(Non) Fidato del tuo database
Dovresti essere in grado di fidarti un po 'dei dati nel tuo database, ma come difesa in profondità è decisamente meglio non fidarti di esso.
Potrebbe esserci per esempio un'iniezione SQL limitata, che consente l'inserimento di dati nel database, ma nient'altro (forse perché i tuoi diritti di database sono gestiti correttamente).
Ma ora, un utente malintenzionato ha ottenuto l'iniezione di oggetti e chissà cosa potrebbe comportare.
Integrità dei dati
Potresti utilizzare un HMAC per verificare l'integrità dei tuoi dati. In questo modo, puoi essere sicuro che ciò che è entrato nel database è la stessa cosa che ne deriva (purché un utente malintenzionato non abbia accesso alla chiave, che ad esempio può essere memorizzata nel codice sorgente).
Salva unserialize
PHP7 consente un parametro opzioni aggiuntive, in cui è possibile specificare quali classi unserialize è consentito creare.
Questo limita già la potenza dell'iniezione dell'oggetto. Un utente malintenzionato può ancora sovrascrivere i campi nell'oggetto stesso, che possono comunque eseguire se si presuppone l'accesso in scrittura al database, che potrebbe non essere dannoso, ma non possono creare oggetti arbitrari.
Convalida dell'input
Potresti anche eseguire alcune convalide sui dati prima di inviarli a unserialize, come raccogliere tutte le stringhe O:X
e controllare se X è un oggetto consentito.
Ma raccomando vivamente di salvare la soluzione unserialize dall'alto.
Mitigazione: non avere classi e funzioni sfruttabili
È una buona idea controllare i dati e l'autenticazione a livello di funzione. Ad esempio, non dovresti semplicemente assumere che il campo x può essere considerato attendibile perché non è (attualmente) controllato dall'utente, e quindi ad esempio è sicuro passare al passthru.
Non memorizzare oggetti
Se non hai una buona ragione per farlo, non dovresti memorizzare oggetti nel database.