Eigener Request Validator in ASP.NET 4.0

Per Zufall bin ich auf eine neue Klasse in .NET 4.0 gestossen. Im März habe ich mir noch Gedanken gemacht, wie die Request Validation abgeschaltet werden kann – gut der Lösungsweg ist in der Fehlermeldung beschrieben – aber es gibt in .NET 4.0 eine neue Klasse mit dem Namen RequestValidator.

Das Problem mit der bisherigen Request Validation, es ist Best Practice diese zu deaktivieren. Unter anderem auch, weil diese bei Eingaben wie a <b bereits eine Ausnahme wirft und den Bearbeitungsprozess beendet. Zudem ist es gelegentlich eine ausdrückliche Anforderung, das einfache HTML-Elemente erfasst werden können.

Abbildung 1
Abbildung 1 Eine ungefährliche gefährliche Anfrage ;-)
Abbildung 2
Abbildung 2 Abbruch der Anwendung bei einfachen HTML

Ab ASP.NET 4.0 besteht nun die Möglichkeit, in diesen Validierungsprozess einzugreifen. Mithilfe der AntiXSS-Library kann so bspw. auf sicheres HTML geprüft werden, dieses zu erlauben und alles andere zu verwerfen und den Verarbeitungsprozess zu beenden. Der Vorteil, die Verarbeitung wird nur noch abgebrochen, wenn die Eingabe HTML enthält, das nicht durch die Prüfung der AntiXSS-Komponente kommt.

Dazu muss von der Klasse RequestValidator abgeleitet und die Methode IsValidRequestString überschreiben werden.

C#
namespace RequestValidation
{
  using System;
  using System.Web;
  using System.Web.Util;
  using Microsoft.Security.Application;

  public class SafeHtmlRequestValidator : RequestValidator
  {
    protected override bool IsValidRequestString(System.Web.HttpContext context, 
        string value, 
        RequestValidationSource requestValidationSource, 
        string collectionKey, 
        out int validationFailureIndex)
    {
      validationFailureIndex = 0;

      if (requestValidationSource == RequestValidationSource.Form)
      {
        if (IsSafeHtmlString(value))
        {
          return true;
        }
      }

      return base.IsValidRequestString(context, 
                 value, 
                 requestValidationSource, 
                 collectionKey, 
                 out validationFailureIndex);
    }

    private static bool IsSafeHtmlString(string value)
    {
      string value1 = HttpUtility.HtmlDecode(AntiXss.GetSafeHtmlFragment(value));
      return value1 == value;
    }
  }
}

Anschliessend wird dieser in der web.config mit Hilfe des httpRuntime-Elements registriert.

web.config
<system.web>
  <httpRuntime requestValidationType="RequestValidation.SafeHtmlRequestValidator"/>
---

Werden die oberen Eingaben wiederholt, so wird der Verarbeitungsprozess nicht mehr beendet. Lediglich wenn Code mit Scriptinhalten eingegeben wird, erzeugt der angepasste Validator einen Fehler und loggt diesen zusätzlich im Event-Log.

Abbildung 3
Abbildung 3 Eingabe a <b erzeugt keinen Abbruch mehr
Abbildung 4
Abbildung 4 Einfaches HTML wird akzeptiert
Abbildung 5
Abbildung 5 HTML mit Script <img src="" onerror="alert('Test')" /> wird abgebrochen

Wichtig dabei ist zu beachten, dass diese Variante nicht als alleiniges Sicherheitsmerkmal betrachtet werden darf. Der Angreifer ist immer im Vorteil, er wird die eine oder andere Möglichkeit finden Code einzuschleussen. Bei den frühren ASP.NET-Versionen war das mit der Out of the Box Request Validation nicht anders.

Hier habe ich einen Mittelweg zwischen User Experience und Sicherheit. Encoding von Eingaben müssen trotzdem weiterverwendet werden. Versuche sind wie bereits erwähnt im Event-Log ersichtlich, ein Vorteil zu bisherigen Best Practice: Abschlaten.

  •  
  • 0 Kommentar(e)
  •  

Mein Kommentar

Über jeden weiteren Kommentar in diesem Post benachrichtigen.

Zurück

Translate this page

Kategorien

  • [-].NET Development (215)
  • [-]Datenbank (26)
  • HTML (1)
  • Konfiguration (12)
  • Mind Map (10)
  • Off-topic (9)
  • Open Source (3)
  • Qualität (7)
  • Sharepoint (6)
  • Sicherheit (2)

Archiv

Social Bookmarking

Bookmark bei: Mr. Wong Bookmark bei: Webnews Bookmark bei: Icio Bookmark bei: Oneview Bookmark bei: Linkarena Bookmark bei: Favoriten Bookmark bei: Seekxl Bookmark bei: Favit Bookmark bei: Social Bookmarking Tool Bookmark bei: Power Oldie Bookmark bei: Bookmarks.cc Bookmark bei: Newskick Bookmark bei: Newsider Bookmark bei: Linksilo Bookmark bei: Readster Bookmark bei: Folkd Bookmark bei: Yigg Bookmark bei: Digg Bookmark bei: Del.icio.us Bookmark bei: Reddit Bookmark bei: Simpy Bookmark bei: StumbleUpon Bookmark bei: Slashdot Bookmark bei: Netscape Bookmark bei: Furl Bookmark bei: Yahoo Bookmark bei: Spurl Bookmark bei: Google Bookmark bei: Blinklist Bookmark bei: Blogmarks Bookmark bei: Diigo Bookmark bei: Technorati Bookmark bei: Newsvine Bookmark bei: Blinkbits Bookmark bei: Ma.Gnolia Bookmark bei: Smarking Bookmark bei: Netvouz Information