Compartilhar via


Como: habilitar a detecção de reprodução de mensagem

Um ataque de reprodução ocorre quando um invasor copia um fluxo de mensagens entre duas partes e reproduz o fluxo para uma ou mais das partes. A menos que seja mitigado, os computadores sujeitos ao ataque processarão o fluxo como mensagens legítimas, resultando em uma série de consequências ruins, como ordens redundantes de um item.

Para obter mais informações sobre a detecção de reprodução de mensagens, consulte Detecção de Reprodução de Mensagens.

O procedimento a seguir demonstra várias propriedades que você pode usar para controlar a detecção de reprodução usando o Windows Communication Foundation (WCF).

Para controlar a detecção de reprodução no cliente usando código

  1. Criar um SecurityBindingElement para usar em um CustomBinding. Para obter mais informações, consulte Como criar uma associação personalizada utilizando o SecurityBindingElement. O exemplo a seguir usa um SymmetricSecurityBindingElement criado com o CreateKerberosBindingElement da classe SecurityBindingElement.

  2. Use a propriedade LocalClientSettings para retornar uma referência à classe LocalClientSecuritySettings e definir qualquer uma das seguintes propriedades, conforme apropriado:

    1. DetectReplay. Um valor booliano. Isso determina se o cliente deve detectar reproduções do servidor. O padrão é true.

    2. MaxClockSkew. Um valor TimeSpan. Controla quanto tempo de distorção o mecanismo de reprodução pode tolerar entre o cliente e o servidor. O mecanismo de segurança examina o carimbo de data/hora enviado e determina se ele foi enviado muito longe no passado. O padrão é 5 minutos.

    3. ReplayWindow. Um valor TimeSpan. Isso determina quanto tempo uma mensagem pode viver na rede depois que o servidor a envia (por meio de intermediários) antes de chegar ao cliente. O cliente rastreia as assinaturas das mensagens enviadas no ReplayWindow mais recente para fins de detecção de reprodução.

    4. ReplayCacheSize. Um valor inteiro. O cliente armazena as assinaturas da mensagem em um cache. Essa configuração especifica quantas assinaturas o cache pode armazenar. Se o número de mensagens enviadas na última janela de reprodução atingir o limite de cache, novas mensagens serão rejeitadas até que as assinaturas mais antigas armazenadas em cache atinjam o limite de tempo. O padrão é 500000.

Para controlar a detecção de reprodução no serviço usando código

  1. Criar um SecurityBindingElement para usar em um CustomBinding.

  2. Use a propriedade LocalServiceSettings para retornar uma referência à classe LocalServiceSecuritySettings e defina as propriedades conforme descrito anteriormente.

Para controlar a detecção de reprodução na configuração do cliente ou serviço

  1. Crie um <customBinding>.

  2. Crie um elemento <security>.

  3. Crie um <localClientSettings> ou <localServiceSettings>.

  4. Defina os seguintes valores de atributo, conforme apropriado: detectReplays, maxClockSkew, replayWindow e replayCacheSize. O exemplo a seguir define os atributos de um elemento <localServiceSettings> e <localClientSettings>:

    <customBinding>  
      <binding name="NewBinding0">  
       <textMessageEncoding />  
        <security>  
         <localClientSettings
          replayCacheSize="800000"
          maxClockSkew="00:03:00"  
          replayWindow="00:03:00" />  
         <localServiceSettings
          replayCacheSize="800000"
          maxClockSkew="00:03:00"  
          replayWindow="00:03:00" />  
        <secureConversationBootstrap />  
       </security>  
      <httpTransport />  
     </binding>  
    </customBinding>  
    

Exemplo

O exemplo a seguir cria um SymmetricSecurityBindingElement usando o método CreateKerberosBindingElement e define as propriedades de reprodução da associação.

private SecurityBindingElement CreateSymmetricBindingForClient()
{
    SymmetricSecurityBindingElement b = SecurityBindingElement.CreateKerberosBindingElement();
    b.LocalClientSettings.DetectReplays = true;
    b.LocalClientSettings.MaxClockSkew = new TimeSpan(0, 3, 0);
    b.LocalClientSettings.ReplayWindow = new TimeSpan(0, 2, 0);
    b.LocalClientSettings.ReplayCacheSize = 10000;
    return b;
}
Private Function CreateSymmetricBindingForClient() As SecurityBindingElement
    Dim b = SecurityBindingElement.CreateKerberosBindingElement()
    With b.LocalClientSettings
        .DetectReplays = True
        .MaxClockSkew = New TimeSpan(0, 3, 0)
        .ReplayWindow = New TimeSpan(0, 2, 0)
        .ReplayCacheSize = 10000
    End With
    Return b
End Function

Escopo de Reprodução: Somente Segurança de Mensagem

Observe que os procedimentos a seguir se aplicam somente ao modo de segurança de Mensagem. Para os modos de Transporte e Transporte com Credencial de Mensagem, os mecanismos de transporte detectam reproduções.

Observações de Conversa Segura

Para associações que permitem conversas seguras, você pode ajustar essas configurações tanto para o canal do aplicativo quanto para a associação de inicialização de conversa segura. Por exemplo, você pode desativar as reproduções para o canal do aplicativo, mas habilitá-las para o canal de inicialização que estabelece a conversa segura.

Se você não usar sessões de conversa seguras, a detecção de reprodução não garante a detecção de reproduções em cenários de farm de servidores e quando o processo é reciclado. Isso se aplica às seguintes associações fornecidas pelo sistema:

Compilando o código

Confira também