Protezione e serializzazione
Poiché la serializzazione può consentire ad altro codice di visualizzare o modificare i dati di un'istanza di un oggetto che non sarebbero altrimenti accessibili, è necessaria un'autorizzazione speciale per il codice con cui viene eseguita la serializzazione: SecurityPermission con il flag SerializationFormatter specificato. In base ai criteri predefiniti, questa autorizzazione non è concessa a codice scaricato da Internet o a codice Intranet, ma solo al codice presente sul computer locale.
Di norma, tutti i campi di un oggetto sono serializzati, ovvero dispongono di dati rappresentati nei dati serializzati relativi all'istanza. Per il codice in grado di interpretare il formato è possibile determinare i valori dei dati, a prescindere dall'accessibilità del membro. In modo analogo, la deserializzazione consente di estrarre dati dalla rappresentazione serializzata e di impostare direttamente lo stato dell'oggetto, a prescindere dalle regole di accessibilità.
Se possibile, rendere non serializzabili gli oggetti che possono contenere dati sensibili alla protezione. Se tali oggetti devono essere resi serializzabili, provare a creare campi specifici per mantenere non serializzabili i dati sensibili. Se questa operazione non è possibile, tenere presente che tali dati saranno esposti a parti di codice che dispongono dell'autorizzazione per la serializzazione e accertarsi che tale autorizzazione non sia ottenuta da codice dannoso.
L'interfaccia ISerializable deve essere utilizzata solo nell'infrastruttura di serializzazione. Se non è protetta, questa interfaccia può tuttavia rilasciare informazioni sensibili. Se la serializzazione personalizzata è fornita tramite l'implementazione di ISerializable, adottare le seguenti precauzioni:
Il metodo GetObjectData deve essere protetto in modo esplicito esigendo SecurityPermission con l'autorizzazione SerializationFormatter o accertandosi che con l'output del metodo non venga rilasciata alcuna informazione sensibile. Di seguito è riportato un esempio:
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) { }
Il costruttore speciale utilizzato per la serializzazione deve anche eseguire la convalida dell'input ed essere protetto o privato per evitare l'utilizzo improprio da parte di codice dannoso. Devono essere applicati gli stessi controlli di protezione e le stesse autorizzazioni richieste per ottenere un'istanza della classe in altri modi, come la creazione esplicita o indiretta della classe tramite un tipo di factory.