java - improvements - ¿Qué significa que el método Instant.readObject "defiende[s] contra las secuencias maliciosas"?
localdatetime java (2)
Instant
, y otras clases de java.time
, se serializan utilizando un delegado con ámbito de paquete: java.time.Ser
. Consulte el método writeReplace
para ver cómo se crea el delegado.
Como tal, la única forma en que podría llamarse el método readObject
es si alguien estaba pasando una secuencia maliciosa (una creada con el único propósito de intentar crear un objeto no válido). La excepción asegura que tales transmisiones maliciosas estén bloqueadas.
En general, cada vez que se utiliza un delegado de serialización, debe considerar bloquear readObject
esta manera.
Leyendo el código fuente de la clase Instant
, me encontré con este método
/**
* Defend against malicious streams.
*
* @param s the stream to read
* @throws InvalidObjectException always
*/
private void readObject(ObjectInputStream s) throws InvalidObjectException {
throw new InvalidObjectException("Deserialization via serialization delegate");
}
La descripción me dio curiosidad. ¿Qué es un "flujo malicioso"? ¿Y cómo se defiende este método?
Joshua Bloch, el autor de "Effective Java", ha presentado su idea sobre el patrón de serialización proxy. Fondo muy esclarecedor para su pregunta.
Con este método writeReplace en su lugar, el sistema de serialización nunca generará una instancia serializada de la clase adjunta, pero un atacante podría fabricar uno en un intento de violar las invariantes de la clase. Para garantizar que dicho ataque fallaría, simplemente agregue este método readObject a la clase adjunta ...
// readObject method for the serialization proxy pattern
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
throw new InvalidObjectException("Proxy required");
}