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
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.
Use a LocalClientSettings propriedade para retornar uma referência à LocalClientSecuritySettings classe e defina qualquer uma das seguintes propriedades, conforme apropriado:
DetectReplay
. Um valor booleano. Isso controla se o cliente deve detetar repetições do servidor. A predefinição étrue
.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.ReplayWindow
. UmTimeSpan
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 recenteReplayWindow
para fins de deteção de repetição.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
Crie um SecurityBindingElement para usar em um CustomBindingarquivo .
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
Crie um <customBinding>.
Crie um
<security>
elemento.Crie um localClientSettings> ou< localServiceSettings>.<
Defina os seguintes valores de atributo, conforme apropriado:
detectReplays
,maxClockSkew
,replayWindow
ereplayCacheSize
. 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:
WSHttpBinding com a EstablishSecurityContext propriedade definida como
false
.
Compilando o código
Os namespaces a seguir são necessários para compilar o código: