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.

Consulte também

Conceitos

Diretrizes para Codificação Segura