Sécurité et sérialisation
Mise à jour : novembre 2007
Comme la sérialisation permet à un autre code de voir ou de modifier les données de l'instance d'objet qui seraient autrement inaccessibles, le code effectuant la sérialisation doit posséder une autorisation particulière : SecurityPermission avec l'indicateur SerializationFormatter spécifié. Dans le cadre de la stratégie par défaut, cette autorisation n'est pas accordée à du code téléchargé depuis Internet ou un intranet ; seul le code sur l'ordinateur local reçoit cette autorisation.
En règle générale, tous les champs d'une instance d'objet sont sérialisés, ce qui signifie que des données sont représentées dans les données sérialisées pour l'instance. Il est possible pour le code capable d'interpréter le format de déterminer les valeurs des données, quelle que soit l'accessibilité du membre. De même, la désérialisation extrait des données de la représentation sérialisée et définit l'état de l'objet directement, quelles que soient là encore les règles d'accessibilité.
Si possible, faites en sorte qu'un objet pouvant contenir des données de sécurité sensibles soit non sérialisable. Si l'objet doit être sérialisable, essayez de définir des champs spécifiques qui contiennent des données sensibles non sérialisables. Si cela n'est pas possible, gardez à l'esprit que ces données seront exposées à n'importe quel code autorisé à sérialiser, et veillez à ce qu'aucun code nuisible n'obtienne cette autorisation.
L'interface ISerializable est destinée à être utilisée uniquement par l'infrastructure de sérialisation. Cependant, si celle-ci n'est pas protégée, elle risque de révéler des informations sensibles. Si la sérialisation personnalisée est fournie par l'implémentation de ISerializable, veillez à prendre les précautions suivantes :
La GetObjectData doit être sécurisée de manière explicite soit en demandant la SecurityPermission avec l'autorisation SerializationFormatter spécifiée, soit en vous assurant qu'aucune information sensible n'est divulguée avec la sortie de la méthode. Par exemple :
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) { }
Le constructeur spécial utilisé pour la sérialisation doit également effectuer une validation minutieuse de l'entrée et doit être soit protégé, soit privé afin d'éviter une utilisation par du code nuisible. Il doit appliquer les mêmes vérifications de sécurité et autorisations nécessaires afin d'obtenir une instance de cette classe par d'autres moyens, comme la création explicite ou indirecte de la classe par une fabrique.