Seguridad y serialización
Actualización: noviembre 2007
Dado que la serialización puede permitir que otro código vea o modifique los datos de la instancia del objeto, a los que no se podría tener acceso en cualquier otro caso, se requiere del código que realiza la serialización un permiso especial: SecurityPermission con el marcador SerializationFormatter especificado. De acuerdo con la directiva predeterminada, no se concede este permiso al código descargado de Internet o de la intranet; únicamente el código del equipo local tiene garantizado este permiso.
Normalmente, todos los campos de la instancia de un objeto están serializados, lo que significa que los datos se representan como datos serializados en la instancia. El código que puede interpretar este formato puede determinar los valores de los datos, independientemente de la accesibilidad del miembro. De forma similar, la deserialización extrae los datos de la representación serializada y establece el estado del objeto directamente, de nuevo sin tener en cuenta las reglas de accesibilidad.
Los objetos que puedan contener datos relativos a la seguridad deben convertirse en objetos no serializables si es posible. Si los objetos deben serializarse, intente convertir en no serializables los campos específicos que contengan datos confidenciales. Si esto no es posible, tenga en cuenta que estos datos se pueden exponer a cualquier código que tenga permiso para serializar, por tanto, asegúrese de que ningún código malicioso puede obtener este permiso.
La interfaz ISerializable está diseñada para su utilización en la infraestructura de serialización únicamente. Sin embargo, si no está protegida, puede mostrar información confidencial. Si proporciona una serialización personalizada implementando ISerializable, asegúrese de que toma las siguientes precauciones:
Se debe proteger explícitamente el método GetObjectData exigiendo el permiso SecurityPermission con el marcador SerializationFormatter especificado o asegurándose de que en el resultado del método no se libere información confidencial. Por ejemplo:
Public Overrides<SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter := True)> _ Sub GetObjectData(info As SerializationInfo, context As StreamingContext) End Sub
[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter =true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { }
El constructor especial utilizado para la serialización debe realizar también una validación de entrada exhaustiva y debe ser de tipo protegido o privado para ayudar a proteger contra el uso indebido por parte de código malicioso. Debe exigir las mismas comprobaciones de seguridad y permisos que se requieren para obtener una instancia de ese tipo de clase por cualquier otro medio, como crear la clase de forma explícita o indirecta mediante algún tipo de generador.