NoBot

Descripción

El NoBot es un potentísimo control que nos ayudará a luchar contra el spam. Su funcionalidad trata de emular a los Captcha, de modo que se trata de evitar que un robot haga varios postback en la Web.

Recordemos que los Captcha suelen ser imágenes de caracteres distorsionados sobre los que un humano tiene que evaluar qué caracteres son e introducirlos. Por tanto, un Captcha es mucho más seguro que un NoBot, pero el NoBot no requiere participación humana alguna, por lo que se hace transparente al usuario y le evita molestias.

Así pues, podremos aplicar el NoBot sobre aplicaciones Web donde el Spam no sea un problema crítico, sino simplemente molesto.

Propiedades

• OnGenerateChallengeAndResponse: método de servidor opcional desde donde podemos implementar un trabajo específico extra para ayudar al NoBot a detectar robots. Lo veremos mejor en el ejemplo.
• ResponseMinimumDelaySeconds: número de segundos por debajo de los cuales un postback se considerará inválido.
• CutoffWindowSeconds: ventana de tiempo en segundos utilizada por el CutoffMaximumInstances.
• CutoffMaximumInstances: cantidad de PostBacks permitidos por una misma IP en la ventana de tiempo definida por CutoffWindowSeconds.

Ejemplo

Vamos a trabajar con el NoBot desde dos frentes. Por una parte no permitiremos que se hagan dos PostBacks en menos de 6 segundos (tiempo exagerado para hacer mejor la prueba. Por otro lado, mediante la función “CustomChagellengeResponse”, vamos a exigir que el navegador implemente el motor DOM, algo que sí hacen todos los navegadores modernos, pero no es común en Robots de Spam.

La comprobación de si se ha pasado el Test la hacemos en el manejador del evento Load de la página, indicando –si procede- el motivo por el cual no se ha pasado la prueba.

NoBot.aspx
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<asp:Button ID="Button1" runat="server" Text="Button" />
<ajaxToolkit:NoBot ID="NoBot1" runat="server"
ResponseMinimumDelaySeconds="6"
OnGenerateChallengeAndResponse="CustomChallengeResponse" />

NoBot.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
AjaxControlToolkit.NoBotState estado;

if (!NoBot1.IsValid(out estado))
Label1.Text = "Eres un robot: " + estado.ToString();
else
Label1.Text = "No eres un robot ;)";
}
}

protected void CustomChallengeResponse(object sender, AjaxControlToolkit.NoBotEventArgs e)
{
// Implicamos al motor DOM del navegador, exigiéndole unos sencillos calculos sobre el área de un Panel que nos inventamos
Panel p = new Panel();
p.ID = "ParaMSCoder";
Random rand = new Random();
p.Width = rand.Next(300);
p.Height = rand.Next(200);
p.Style.Add(HtmlTextWriterStyle.Visibility, "hidden");
p.Style.Add(HtmlTextWriterStyle.Position, "absolute");
((AjaxControlToolkit.NoBot)sender).Controls.Add(p);
e.ChallengeScript = string.Format("var e = document.getElementById('{0}'); e.offsetWidth * e.offsetHeight;", p.ClientID);
e.RequiredResponse = (p.Width.Value * p.Height.Value).ToString();
}