Aus irgendeinem Grund werden seit einigen Tagen viele Bestellungen für mein ASP.NET 2.0 Buch vorgenommen. Was sich zunächst gut anhört, ist bei Blick in die Logfiles ein automatisiertes ausfüllen von ASP.NET Textboxen mit anschliessendem Post. Und das von verschiedenen IP Adressen aus verschiedenen Ländern. Keine Ahnung warum das so ist. Grundsätzlich wird diese Art meist verwendet um Gästebücher oder Blog Kommentare zu füllen mit dem Ziel Links auf die eigenen Web Sites zu platzieren um bei Google und & co weiter oben zu sein.
Die Abhilfe sind sogenannte Captchas. Das sind Bilder auf denen Text versteckt ist den man dann wieder abtippen muss.
Die Erstellung solcher Grafiken ist mit .NET möglich, aber aufwendig. Ich habe deshalb eine mathematische Aufgabe gestellt die der User lösen muss
Da ich ein minimalen Aufwand betreiben woilte habe ich einfach einen CompareValidator, 2 Textboxen und minimalen Code verwendet.
Zunächst die “komplexe” Geschäftslogigk
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim a As Integer = Rnd() * 10
Dim b As Integer = Rnd() * 10
lblCaptcha.text = a.ToString + " + " + b.ToString
hiddenCaptcha.Text = a + b
End Sub
Dann die auch ganz leichte Eingabeprüfung
<asp:TextBox ID="txtCaptcha" runat="server"></asp:TextBox>
<asp:CompareValidator ID="cv1" runat="server" Display="Dynamic"
ErrorMessage="Bitte das rechenergebnis eintragen" ControlToValidate="txtCaptcha" ControlToCompare="hiddenCaptcha"></asp:CompareValidator>
Der einzige Trick den ich verwendet habe ist rund um die zweite Textbox. Normalerweise würde man auf ein Hiddenfield tippen, wenn man Daten in der Page haben möchte und diese nicht anzeigt. Leider kann der CompareValidator nicht auf ein Hiddenfield vergleichen und so muss eine Textbox her. Wenn man dort visible auf false setzt, wird diese aber nicht mehr zum Client übertragen. Also folgender Trick um eine Textbox quasi unsichtbar zu machen:
<asp:TextBox ID="hiddenCaptcha" runat="server" Enabled=false Height=0 Width=0 BorderStyle="None" BorderColor=White></asp:TextBox>