Partilhar via


Como: Ativar a deteção de repetição de mensagens

Um ataque de repetição ocorre quando um invasor copia um fluxo de mensagens entre duas partes e reproduz o fluxo para uma ou mais partes. A menos que 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 deteção de repetição de mensagens, consulte Deteção de repetição de mensagens.

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

Para controlar a deteção de repetição no cliente usando o código

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

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

    1. DetectReplay. Um valor booleano. Isso controla se o cliente deve detetar repetições do servidor. A predefinição é true.

    2. MaxClockSkew. Um TimeSpan valor. Governa quanto tempo de distorção o mecanismo de repetiçã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 TimeSpan valor. Isso governa quanto tempo uma mensagem pode permanecer na rede depois que o servidor a envia (através de intermediários) antes de chegar ao cliente. O cliente rastreia as assinaturas das mensagens enviadas no mais recente ReplayWindow para fins de deteção de repetiçã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 repetição atingir o limite de cache, as 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 deteção de repetição no serviço usando o código

  1. Crie um SecurityBindingElement para usar em um CustomBindingarquivo .

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

Para controlar a deteção de repetição na configuração para o cliente ou serviço

  1. Crie um <customBinding>.

  2. Crie um <security> elemento.

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

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

    <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 CreateKerberosBindingElement método e define as propriedades de repetição da ligaçã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

Âmbito da Repetição: Apenas Segurança de Mensagens

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

Notas de conversação seguras

Para associações que permitem conversas seguras, você pode ajustar essas configurações tanto para o canal do aplicativo quanto para a vinculação de inicialização de conversa segura. Por exemplo, você pode desativar as repetiçõ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ção seguras, a deteção de repetição não garante a deteção de repetições em cenários de farm de servidores e quando o processo for reciclado. Isto aplica-se às seguintes ligações fornecidas pelo sistema:

Compilando o código

Consulte também