Handschuh auf Touchscreen Tastatur gelegt – Wie vermeide ich ein ständiges Neuladen?

Michael Schwarz on Monday, January 26, 2009

Vor einiger Zeit hatten wir ein Problem, dass immer wieder mal eine sehr Hohe Auslastung auf einem Web Server zu verzeichnen war. Beim Analysieren der Logdateien stellte sich heraus, dass es sich um ein Windows XP Embedded handelte. Nach langem Hin und Her konnte ich das Problem eingrenzen, und nach weiteren Wochen dann auch finden.

Problem war, dass ein Fahrer eines Gabelstapler mit integriertem Touchscreen und Windows XP Embedded seine Handschuhe genau auf die F5 Taste gelegt hat. Wer das mal ausprobiert hat, stellt schnell fest, dass dadurch Tausende http Aufrufe gestartet werden, der Web Browser sich aber nicht um die Antwort schert.

Nun, wie konnte man dieses Problem schnell in den Griff bekommen? Richtig, mit einem IHttpModule, welches alle Zugriffe überwacht, und im richtigen Moment dann anstatt dem Original Source Code ein kleines JavaScript mit einem alert(...) zurückliefert. Warum ein alert(...)? Weil man das mit der Maus/Touchscreen oder mir der Eingabetaste bestätigen muss.

Hier ein Auszug aus dem IHttpModule:

public class DosAttackModule : IHttpModule
{
  void IHttpModule.Init (HttpApplication context)
  {
    context.BeginRequest += 
      new EventHandler (context_BeginRequest);
  }
  private void context_BeginRequest (object sender, EventArgs e)
  {
    HttpRequest request = HttpContext.Current.Request;

    string ip = request.UserHostAddress;
    string page = request.PhysicalPath.ToLower ()
      .Replace (request.MapPath("~/")
      .ToLower (), "").Replace ("\\", "/");

    if (!page.EndsWith (".aspx")) // only log ASPX files
      return;

    string key = ip + "_" + page;

    if (_Banned.Contains (key)) {
      HttpContext.Current.Response.StatusCode = 403;
      HttpContext.Current.Response.Write (@"<html>
<head><title>Error</title></head>
<body onload=""alert('Your browser has made too many requests per second, probably by a malfunction.');document.location.reload();"">
</body>
</html>");
      HttpContext.Current.Response.End ();
    }

    CheckIpAddress (key);
  }
}

Wenn jetzt F5 zu oft gedrückt wird (CheckIpAddress), dann steckt in der Liste _Banned die IP Adresse, hier zusätzlich noch der Seitenname. Erscheint der Dialog muss man 5 Sekunden warten, erst dann ist die IP Adresse aus der Liste entfernt worden.