DevTrain

Autor: Hannes Preishuber

Sicherheit mit Validate Request

Manchmal will man in seinen Web Appliaktionen HTML und Script Code aus der Datenbank holen und schreiben. Für die visuelle Entwicklung ist das sehr unkomfortabel und darüber hinaus unsicher. In unserem Fall stellen wir Code Beispiele aus dem Magazin ASP.NET professional über die gleichnamige Web Site Online zur Verfügung.

Weil die Beispiele zusätzliche Metadaten wie Autor oder Heftseite benötigen, bietet sich die Ablage in eine Tabelle an. Zunächst muss der Code seinen Weg in die Datenbank finden. Dazu wählen wir einen SQL Server und den Feldtyp Text, der in der Länge praktisch unbegrenzt ist.

Ein häufiges Problem dabei sind die Sonderzeichen wie Hochkommas, die bei einer Zeichenkettenaddition falsche SQL Syntax ergeben.
"select * from test where feld="""

Unter dem Schlagwort SQL Injection finden sich dazu jede Menge Artikel, wie man dieses missbrauchen kann. (auch hier bei devtrain)

Dieses Problem lässt sich mit eim Einsatz von Parametern sauber umgehen. Dabei müssen nicht einmal Stored Procedures zum Einsatz kommen. Es reicht auch ein einfaches SQL Kommando, dem Parameter mit dem @ mitgegeben werden. Jeder Parameter muss dann genau typisiert werden und kann dann per Name oder Index angesprochen werden. Der Inhalt des Feldes wird dann direkt mit dem richtigen Typ zugewiesen.

dim sql As String = "insert into listings (beschreibung,heft,seite,autor,code) values (@beschreibung,@heft,@seite,@autor,@code)"

Cmd = New SqlCommand(sql, conn)
Cmd.Parameters.Add(New SqlParameter("@beschreibung", SqlDbType.VarChar, 50))
Cmd.Parameters.Add(New SqlParameter("@Code", SqlDbType.Text))
Cmd.Parameters(0).Value = txtBeschreibung.Text
Cmd.Parameters(4).Value = txtCode.Text
Cmd.ExecuteScalar()
conn.Close()


ASP.NET prüft aber nun ob gefährlicher Code im Textfeld eingegeben wurde. Dabei wird HTML generell als verboten eingestuft. Wird nun eine solche Eingabe per Submit gesendet, schützt ASP.NET sich automatsich mit einer Exception. Um dieses Verhalten zu ändern können Sie in der Page Direktive  Validaterequest auf false setzen.
<%@ Page validateRequest=false .....

Nun muss man aber selbst Hand anlegen um den Code zu säübern, bervor er in die Datenbank und dann wieder in den Webbrowser kommt. Auf der Webpage ww.aspnet-professional.de wurde das mit einer Textbox zum anzeigen des Codes gelöst.
Andernfalls muss der Inhalt des Feld erst nach HTML codiert werden. Dazu verwendet man aus dem Server Objekt die Helper Funktion HTMLEncode.
Server.HtmlEncode(dsCustomers.Customers(0).CompanyName)

Um beim speichern auf der sicheren Seite zu sein, bleibt eigentlich nur der Weg über Replace. Damit können alle relevanten Zeichen ersetzt werden wie z.B. <>


Erfasst am: 23.12.2002 - Artikel-URL: http://www.devtrain.de/news.aspx?artnr=812
© Copyright 2003 ppedv AG - http://www.ppedv.de