Sanitize user input

Hoi,

mich würde intressieren wie ihr mit User-Input auf Webpages umgeht.

Zu einem intressiert mich wann ihr User-Daten auf ihre Richtigkeit überprüft.
Also beim einem Formular zb. beim Absenden oder schon direkt bei der Eingabe via JavaScript/AJAX? (Ob ein Username schon benutzt ist, die E-Mail Addresse ein valides Format hat, ...)

Was mich auch noch intressieren würde, wäre wie ihr mit Sonderzeichen in User-Inputs umgeht (speziell "<" und ">") in Bezug auf XSS.
Wandelt ihr diese direkt um und speichert dann die schon gesicherten Werte in der Datenbank, oder lässt ihr die Daten direkt so in die Datenbank und überprüft erst bei der Ausgabe die Daten und ersetzt wenn nötig die HTML-Tags?

[Ein Grund, warum ihr es so macht und nicht andersrum wäre auch nett]

MfG
Inliferty
 
Hi,

bei einem Formular mache ich üblicherweise beides. Das Überprüfen auf dem Server ist ein muss und das per JS dann die Kür :) Der sollte ja möglichst nicht mehrmals ein Forumlar abschicken um eventuelle Fehler bei der Eingabe zu verbessern, sondern nur einmal. (Ausnahme Captchas und dergleichen)


Sonderzeichen ersetze ich vor dem Eintragen in die Datenbank, da dies zum einen einfacher ist. Es gibt meist mehr Ausgabemöglichkeiten als Eingabemöglichkeiten->Aufwand sinkt und man muss nur einmal daran denken die Sonderzeichen zu ersetzen. Außerdem kann ich das Ersetzen zum Beispiel in Adminpanels ausschalten, um mehr Einstellmöglichkeiten zu haben. Um schnell mal was zu testen müsste man ansonsten alle Ausgaben abändern und die Arbeit will ich mir für einen kurzen Test nicht machen :)

--
Enterprize1
 
Also Danke für dein Kommentar und wenn ich das richtig sehe mache ich es schon fast richtig.
Nur für die Überprüfung vor dem Absenden von Formularen war ich noch zu faul :rolleyes: (Aber steht schon auf der ToDo)

MfG
Inliferty
 
Den Plausibilitätscheck auf Clientseite spare ich mir meistens. Bei größeren (und nichttrivialen) Formularen wäre es aber vermutlich ganz sinnvoll.
Auf der Serverseite druchlaufen die Eingaben normalerweise eine Kaskade von Validatoren und werden solange an die Eingabemaske zurückgeschickt, bis sie alle Tests bestehen (überlicherweise: Felder dürfen nicht leer sein / müssen einer Regex entsprechen / müssen eine Zahl sein / eine ID oder ein Identiefier muss existieren usw.)
Das Escaping passiert bei mir immer nur bei der Ausgabe. Im Controller und in der Datenbank liegen die Eingaben normalerweise immer als beliebiger UTF8-String vor.
Ich habe für Userinput verschiedene Escaping-Stufen, die von der Art des Feldes abhängt.
Manche Felder müssen Integer (oder andere Zahlen) in einem Bestimmten Format und einem bestimmten Bereich sein. Durch Validatoren und das entsprechende Datenformat in der Datenbank stelle ich sicher, dass da nie was durchkommt, was bei der Ausgabe escapt werden muss.
Andere Felder (z.B. E-Mail Adresse oder Benutzername) werden als Plaintext gehandhabt und bei der Ausgabe auch zu Plaintext escapt. Es werden einfach alle <,>,&," umgewandelt und das Ergebnis ist ein Plaintext ohne Tags.
Dann gibt es noch die dritte Stufe. Das sind Kommentarfelder oder sonstige Volltexteingaben mit "magischen" Elemente. Es wird eine BBCode-ähnliche Transformaiton durchgeführt, die auch von Benutzer eigene HTML-Tags entfernt (nur eigens zugelassene Tags können durch sowas wie "[ b ]Bold[ /b ]" erzeugt werden).

mfg, metax.

edit:
Nachtrag: Ich habe hier noch einen Artikel gefunden, in dem gezeigt wird, wie man manche Browser dazu bringen kann, eine ungefährliche Benutzereingabe doch zu parsen, indem man Base64-kodierte Tags verwendet und dem Browser vermittelt, es würde das UTF7-Charset gelten: https://code.google.com/p/doctype/wiki/ArticleUtf7
Man sollte also immer seinen Zeichensatz im HTTP-Header und am besten auch noch im HTML korrekt festlegen.
 
Zuletzt bearbeitet:
Zurück
Oben