Serialização e segurança
Porque a serialização pode permitir que outro código ver ou modificar dados de instância do objeto seriam inacessíveis, uma permissão especial é necessária executar a serialização de código: SecurityPermissioncom o comoSerializationFormatter sinalizador especificado. Sob a diretiva padrão, essa permissão não é dada para download de Internet ou intranet código; Esta permissão é concedido a apenas o código no computador local.
Normalmente, todos os campos de uma instância de objeto são serializados, que significa que os dados são representados nos dados serializados da instância. É possível que o código que pode interpretar o formato para determinar quais valores de dados, independentes da acessibilidade do membro. Da mesma forma, a desserialização extrai dados da representação serializada e define o estado do objeto diretamente, novamente independentemente de ter regras de acessibilidade.
Qualquer objeto que pode conter dados confidenciais deve ser feito a nonserializable, se possível. Se ele deve ser serializável, tente fazer a campos específicos que armazenam dados confidenciais não serializavel. Se isso não pode ser feito, lembre-se de que esses dados serão expostos a qualquer código que tenha permissão para serializar e certifique-se de que nenhum código mal-intencionado pode obter essa permissão.
O ISerializable interface é destinado ao uso somente pela infra-estrutura de serialização. No entanto, se desprotegido, ele pode liberar potencialmente informações confidenciais. Se você fornecer a serialização personalizada com a implementação de ISerializable, certificar-se de que você tome as seguintes precauções:
O GetObjectData método deve ser explicitamente protegido por exigentes de SecurityPermission com comoSerializationFormatter permissão especificado ou, certificando-se de que nenhuma informação confidencial lançada com a saída do método. Por exemplo:
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) { }
O construtor especial usado para serialização também deve executar a validação da entrada completa e deve ser protegido ou particular para ajudar a proteger contra uso indevido por código mal-intencionado. Ele deve aplicar a mesma verificações de segurança e permissões necessárias para obter uma instância de uma classe tal por outros meios, como, por exemplo, explicitamente criando a classe ou indiretamente-lo por meio de algum tipo de fábrica.