Bots de combate (C#)
por Christian Wenz
Os bots automatizados engessam weblogs e outros sites com spam, enviando formulários de comentários sem nenhuma interação do usuário. O controle NoBot no ASP.NET Kit de Ferramentas de Controle AJAX pode ajudar a combater esses bots.
Visão geral
Os bots automatizados engessam weblogs e outros sites com spam, enviando formulários de comentários sem nenhuma interação do usuário. O controle NoBot no ASP.NET Kit de Ferramentas de Controle AJAX pode ajudar a combater esses bots.
Etapas
Uma abordagem comum para derrotar bots é usar o teste CAPTCHAs Completely Automated Public Turing para diferenciar computadores e humanos. Um teste de Turing era originalmente um teste em que alguém precisava decidir se um parceiro de comunicação é um humano ou uma máquina. Na Web, um CAPTCHA geralmente consiste em uma imagem com algumas letras distorcidas nela. A ideia é que apenas um humano possa ler as letras na imagem, enquanto os algoritmos de OCR falharão.
Há várias vantagens e desvantagens nessa abordagem, mas uma discussão sobre isso está além do escopo deste tutorial. No entanto, há um controle no kit de ferramentas de controle AJAX ASP.NET que fornece uma abordagem semelhante: NoBot
. É mais fácil de superar do que um CAPTCHA, mas é muito fácil de usar e se sai muito bem em sites como blogs onde é considerado um sucesso se a maioria das tentativas de spam for derrotada, o que o NoBot
controle pode fazer.
NoBot
intercepta o postback do formulário da Web ASP.NET atual se pelo menos uma dessas condições for atendida:
- O navegador falha ao resolver um quebra-cabeça JavaScript (por exemplo, quando o JavaScript é desativado)
- O usuário enviou o formulário para rapidamente
- O endereço IP do cliente enviou o formulário com muita frequência em um determinado período de tempo.
Para marcar para essas condições, o NoBot
controle requer esses atributos (todos opcionais):
ResponseMinimumDelaySeconds
quantidade mínima de segundos entre postbacksCutoffWindowSeconds
intervalo de tempo em que postbacks de um IP são medidasCutoffMaximumInstances
quantidade máxima de segundos por intervalo de tempo
A marcação a seguir exige que pelo menos dois segundos se escorram entre postbacks e que haja apenas cinco postbacks ou menos em um intervalo de 30 segundos:
<ajaxToolkit:NoBot ID="nb" runat="server" CutoffMaximumInstances="5"
CutoffWindowSeconds="30" ResponseMinimumDelaySeconds="2" />
Em seguida, como de costume, inclua o ScriptManager
na página para que a biblioteca ASP.NET AJAX seja carregada e o Kit de Ferramentas de Controle possa ser usado:
<asp:ScriptManager ID="asm" runat="server" />
Como a maioria das verificações NoBot
está ocorrendo no lado do servidor, você precisa marcar o resultado dessas validações. Isso pode ser feito chamando NoBot
o método de .IsValid()
Ele tem um argumento (como parâmetro out
/ByRef
parâmetro) que é do tipo NoBotState
. Sua representação de cadeia de caracteres contém o motivo quando o marcar falha eValid
, caso contrário, . O código a seguir gera uma mensagem de acordo com o NoBot
resultado de :
<script runat="server">
void Page_Load()
{
if (Page.IsPostBack)
{
NoBotState state;
if (!nb.IsValid(out state))
{
Label1.Text = "Data refused ("
+ HttpUtility.HtmlEncode(state.ToString()) + ")";
}
else
{
Label1.Text = "Data entered.";
}
}
}
</script>
Por fim, você precisa de um formulário para enviar e um elemento de rótulo para gerar a mensagem e pronto!
Your comment:
<asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"/><br />
<input type="submit" id="Submit1" runat="server" value="Submit Form" /><br />
<asp:Label ID="Label1" runat="server" />
Ao executar esse script e desativar o JavaScript ou enviar o formulário nos dois primeiros segundos ou enviar o formulário sete vezes em trinta segundos, você receberá uma mensagem de erro. No entanto, use esse controle com sabedoria, já que apenas cerca de 90 a 95% dos usuários têm o JavaScript ativado, portanto, 5 a 10% dos usuários falharão NoBot
no teste.
Essa mensagem de erro pode ter sido causada por um bot (clique para exibir a imagem em tamanho real)