Condividi tramite


Sicurezza 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 sicurezza. 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 soltanto 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 facendo in modo che con l'output del metodo non vengano rilasciate informazioni riservate. 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 sicurezza 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.

Vedere anche

Concetti

Linee guida per la generazione di codice sicuro