(No) Confiando en su base de datos
Debería poder confiar un poco en los datos de su base de datos, pero como defensa en profundidad es definitivamente mejor no confiar en ellos.
Por ejemplo, puede haber una inyección de SQL limitada, que permite insertar datos en la base de datos, pero nada más (quizás porque sus derechos de base de datos se administran correctamente).
Pero ahora, un atacante ganó la inyección de objetos, y quién sabe a qué puede conducir eso.
Integridad de los datos
Puede utilizar un HMAC para verificar la integridad de sus datos. De esa manera, puede estar seguro de que lo que entró en la base de datos es lo mismo que sale de ella (siempre que un atacante no tenga acceso a la clave, que por ejemplo puede estar almacenada en el código fuente).
Guardar unserialize
PHP7 permite un parámetro de opciones adicionales, en el que puede especificar qué clases no autorizadas puede crear.
Esto ya limita el poder de inyección de objetos. Un atacante aún puede sobrescribir los campos en el objeto en sí, lo que puede hacer de todos modos si asumimos el acceso de escritura en la base de datos, lo que puede no ser perjudicial, pero no pueden crear objetos arbitrarios.
Validación de entrada
También puede realizar una validación en los datos antes de enviarlos a unserialize, como recolectar todas las cadenas O:X
y verificar si X es un objeto permitido.
Pero definitivamente recomendaría guardar la solución unserialize desde arriba.
Mitigación: no tener clases y funciones explotables
Es una buena idea verificar los datos y la autenticación en un nivel por función. Por ejemplo, no debe asumir simplemente que el campo x se puede confiar porque no está (actualmente) controlado por el usuario y, por lo tanto, es seguro pasarlo a Passthru.
No almacenar objetos
Si no tiene una buena razón para hacerlo, no debe almacenar objetos en la base de datos.