Zabezpečení a serializace
Protože serializace může povolit jinému kódu zobrazit nebo upravit data instance objektu, které by jinak byly nepřístupné, zvláštní oprávnění je požadováno pro kód, který provádí serializaci: SecurityPermission se specifikovaným příznakem SerializationFormatter. Ve výchozích zásadách toto oprávnění nemá přístup ke kódu staženého ze sítě Internet nebo intranet; pouze kód v místním počítači má toto oprávnění uděleno.
Obvykle jsou serializována všechna pole instance objektu, což znamená, že data jsou reprezentována v serializované podobě dat pro instanci. Je možné, že kód, který dokáže interpretovat formát, může zjistit, jaké jsou hodnoty dat, nezávisle na přístupnosti člena. Podobně deserializace extrahuje data ze serializované reprezentace a nastaví stav objektů přímo, znovu bez ohledu na pravidla přístupu.
Libovolný objekt, který by mohl obsahovat data citlivá na zabezpečení, je třeba označit jako neserializovatelný, pokud je to možné. Pokud musí být serializovatelný, pokuste se provést konkrétní pole, které obsahují důvěrné osobní údaje neserializovatelné. Pokud to není možné, pamatujte na to, že tato data budou vystavena jakémukoli kódu, který má oprávnění k serializaci, a zkontrolujte, že žádný nebezpečný kód nemůže získat toto oprávnění.
Rozhraní ISerializable je určeno pro použití pouze infrastrukturou serializace. Pokud je však nechráněné, může potenciálně uvolnit citlivé informace. Pokud poskytnete vlastní serializaci implementací ISerializable, ujistěte se, že provedete následující opatření:
Metoda GetObjectData by měla být explicitně zabezpečena požadavkem SecurityPermission s oprávněním SerializationFormatter zadaným nebo zajištěním, že žádné důvěrné informace nejsou vypuštěny pomocí výstupu metody. Příklad:
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) { }
Zvláštní konstruktor pro serializaci by měl také provést důkladné ověřování vstupu a měl by být chráněný nebo soukromý k ochraně proti zneužití škodlivým kódem. Měl by uplatňovat stejné kontroly zabezpečení a oprávnění nutná k získání instance této třídy jinými prostředky, například explicitního vytváření třídy nebo jeho nepřímého vytváření prostřednictvím určitého druhu factory.