Formulare gegen SPAM schützen

Um Formulare gegen SPAM-Einträge zu schützen bietet sich ein sog. Captcha an. Die Abkürzung Captcha steht für “completely automated public Turing test to tell computers and humans apart”. Hinter diesem Wort verbirgt sich eine Technik, die mit Hilfe eines Bildes alphanumerische Zeichen darstellt.

Robots, die nun versuchen das Formular per Automatismus auszufüllen scheitern daran, die Zeichen abzulesen und in ein dafür vorgesehenes Formular-Feld einzutragen.

Neben div. kostenpflichtigen Controls findet man auf CodeProject.com eine fertige Klasse inkl. Beschreibung zur freien Verwendung. Die Implementierung ist nicht aufwendig und folgt einem einfachen Schema:

- Generierte Zeichen in Session speichern
- Captcha Image erstellen und anzeigen
- Eingegebene Zeichen mit dem in der Session gespeicherten Wert vergleichen.

Zunächst muß die Klasse in den App_Code Ordner des Webs kopiert und anschließend ein WebForm mit dem Namen CIImage.aspx hinzugefügt werden. Diese WebForm übernimmt das Streaming des Bildes, weshalb auch der gesamte Html-Code entfernt werden muß. In der Page_Load() Methode wird das Bild erstellt und an den OutputStream des Response-Objektes gesendet.

protected void Page_Load(object sender, EventArgs e)
{
    CaptchaImage ci = new CaptchaImage(Session["CaptchaImageText"].ToString(), 200, 50, "Century Schoolbook");
    Response.Clear();
    Response.ContentType = "image/jpeg";
    ci.Image.Save(this.Response.OutputStream, ImageFormat.Jpeg);
    ci.Dispose();
}

Die Seite Default.aspx übernimmt die Anzeige des Captcha-Images und auch die Generierung der angezeigten Zeichen. Ein einfacher HtmlImage-Tag wird verwendet um das Bild anzuzeigen. Die Überprüfung übernimmt ein CustomValidator, der die eingegebenen Zeichen mit denen der Session vergleicht.

<img src="CIImage.aspx" /><br />
<asp:TextBox ID="txtCaptchaText" runat="Server" /><br />
<asp:CustomValidator ID="valCaptcha" runat="server" ErrorMessage="Bitte geben Sie den korrekten Code ein."
Display="dynamic" OnServerValidate="CheckCaptcha"/><br />
<asp:Button ID="cmdGo" runat="server" OnClick="cmdGo_Click" Text="Submit" CausesValidation="true"/>

Die Zeichen werden mit Hilfe der Random Klasse erstellt und anschließend in der Session gespeichert:

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
        Session["CaptchaImageText"] = GenerateRandomCode();
}

private string GenerateRandomCode()
{
    Random random = new Random();
    string captchaCode = "";
    for (int i = 0; i < 6; i++)
        captchaCode = String.Concat(captchaCode, random.Next(10).ToString());

    return captchaCode;
}

Bei Formularen deren Daten sofort nach dem Submit sichtbar sind, wie z.B. für Gästebücher oder Kommentare für Blog-Einträge, macht diese Absicherung durchaus sinn. Auch die hier gezeigte, einfache Implementierung spricht dafür. Spätestens jedoch nachdem ein Robot mehrere Einträge verfasst hat, wird sie sogar absolut erforderlich.

Das Beispielprojekt findet man hier. Das Sourceforge-Beispiel inkl. Captcha-Control Klasse hier.

Wird dieses Beispiel in einer Anwendung mit Themes verwendet muss dies beachtet werden.

2 thoughts on “Formulare gegen SPAM schützen

  1. Kaum zu glauben, aber selbst wenn die Daten hinterher nicht angezeigt werden spammen manche Leute einfach drauf los. In meinem Fall ein Buchungsformular für Ferienhäuser bei dem ich das Ergebnis als Email erhalte. Warum verschwenden diese Spinner trotzdem ihre Zeit dafür mir solchen Spam zu schicken obwohl doch klar ist, dass dieser Spam direkt gelöscht wird?

    Jetzt werde ich wohl oder übel Captcha einbauen um endlich davon ruhe zu haben. Oder kann man irgendwie verhindern, dass das verarbeitende Script-PHP nicht angezeigt bzw. im Quelltext nicht zu sehen ist?

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>