Sven Rautenberg: sichere Variable

Beitrag lesen

Moin!

spricht eigentlich sicherheitstechnisch etwas dagegen, anstatt eine Nutzereingabe mit regulären Ausdrücken auf _erlaubte Zeichen_ hin zu prüfen, einfach die Variable mit $var = strip_tags(addslashes($_POST[var])) zu versehen und ohne weitere Prüfung zu verabreiten?

Da spricht ggf. sehr viel dagegen.

Zunächst mal: _Wenn_ du addslashes und strip_tags verwendest, dann muß _zuerst_ strip_tags angewandt werden, um die unerwünschten HTML-Tags zu entfernen, und erst danach sollte der Reststring escapet werden.

Zweitens: Verwemde addslashes() nur, wenn der Status von magic_quotes_gpc auf off ist, ansonsten hast du zweimal Escaping drin - und das sieht scheiße aus. :)

Drittens: addslashes() ist nicht zum Escaping für Datenbanken geeignet. Nutze die Escape-Funktion der von dir benutzen Datenbank - im Fall von Mysql also mysql_real_escape_string(). Das bedeutet aber: Wenn magic_quotes_gpc=on, mußt du vorher alle Strings mit stripslashes() behandeln, ansonsten kriegst du auch wieder doppeltes Escaping.

Viertens: Auf das Entfernen von HTML-Tags kann auch verzichtet werden. Es kommt drauf an, wie du die gesendeten Daten behandelst - und ausgibst! Wenn die eingegebenen Daten durchgehend nur als "Plain Text" betrachtet werden sollen, dann dürfen Zeichen wie "<" und ">" natürlich NICHT entfernt werden. Sie sollten auch ohne irgendein Escaping in der Datenbank abgespeichert werden. Und das wichtigste: Sie sollten entsprechend den Anforderungen der Ausgabe formatiert werden. Im Falle von simplem Text in HTML bedeutet das, dass ein "<" z.B. als Entity &lt; ausgegeben werden muß. Die Funktion htmlspecialchars() übernimmt das für dich. Dann erscheint jeder eingegebene Text 1:1 exakt wieder so auf der Webseite.

Ich habe eine Formular, wo eigentlich jede Eingabe erlaubt sein soll - außer eben Sachen, die böse sind. Die Eingaben werden in der DB gespeichert und später wieder am Bildschirm ausgegeben.

Plain Text ist nicht böse. Man muß ihn nur passend behandeln und darf ihn eben nicht zu wirksamem HTML werden lassen.

Wo ich bisher geschaut habe, gab's überall nur Erklärungen, wie und mit welchen Regex man auf erlaubte Zeichen prüfen kann, aber nirgends eine Antwort auf diese simple Frage. Sorry, wenn sie zu simpel sein sollte.

Die Eingabeprüfung mit regulären Ausdrücken ist für strengere Vorgaben sinnvoller. Und insbesondere reichen reguläre Ausdrücke bei HTML-Checks eventuell auch gar nicht aus. HTML ist eine Sprache, die man nicht vollständig mit RegEx erfassen und zerlegen kann - man muß sich eventuell einen Parser schreiben, der den Text (durchaus mithilfe von RegEx) passend "versteht".

- Sven Rautenberg

--
My sssignature, my preciousssss!