Christian Seiler: Formulare knacken / oder auch nicht

Beitrag lesen

Hallo Eddie,

a) ich will im endgueltig veroeffentlichten Bericht nichts haben, was dem von mir vorgeschriebenen Seitendesign widerspricht.
Erlaubt sind folgende Tags: b, i, a, li, hr, alle einzugeben als BB-Code [b] (obwohl ich Leuten ohne JavaScript) auch die Eingabe als normale Tags <b> erlauben will (vor allem, da ich in der aktuellen Datenbank tausend normale Tags habe und die nicht alle konvertieren will).
Nur <a> sollte mit Attributen (aber eigentlich nur einem einzigen Attribut) erlaubt sein.

Du könntest Dir die Funktion strip_tags mal anschauen. Allerdings würde ich zu einer Reinen BB-Code Kösung raten, denn sonst müssen die Leute aufpassen, was sie für Sonderzeichen eingeben. (Du könntest natürlich den HTML-Code selbst "scannen" anstelle strip_tags zu verwenden, das birgt aber ein Sicherheitsrisiko, falls Du einen Fehler dabei machst [1]) Daher ist htmlspecialchars (maskiert alle HTML-Sonderzeichen) und danach eine Routine zur Verabeitung von BB-Code am sinnvollsten. (IMHO)

b) ich will nicht, dass beim Aufruf der Seite beim User irgendwelches Zeug zur Ausfuehrung kommt ==> JavaScript, Flash.

Wenn Du von Anfang an keinen direkten HTML-Code erlaubst, dürfte das kein Problem sein. Allerdings dürfen auch Deine Verarbeitungsroutinen für BB-Code, die Du nach htmlspecialchars auf den Code anwendest, keinen HTML-Code produzieren, der so etwas bewirkt.

c) ich will nicht, dass jemand in meinen Formularen Datenbankbefehle ausfuehren kann, aber ich denke, das geht eh' nicht.

Wenn Du Datenbanksonderzeichen escapesed, dann _warscheinlich_ nicht. Allerdings kannst Du Dir nie vollkommen sicher sein. Du solltest immer _sehr_ vorsichtig sein, bevor Du eine Variable an eine Datenbank reichst.

Vielleicht gibt's ja irgendwelche vorgefertigten PHP-Module (denn bei mir laeuft PHP), durch die ich meinen Formular-Inhalt einfach nur noch durchjagen muss, so dass auf der anderen Seite ungefaehrlicher und datenbank-geeigneter Code rauskommt?

Datenbankgeeignet: Schau Dir mysql_escape_string beziehungsweise das Pendant Deiner verwendeten Datenbank. Oder schau Dir gleich PEAR::DB an, das kennt eine Methode quote() sowie einige andere nette Dinge.

HTML-Sonderzeichen: Maskiere sie mit htmlspecialchars.

Aber wie Michael schon gesagt hat, Sicherheit ist immer ein Prozess und kein Zustand; Du musst Dir _jederzeit_ überlegen, wie jemand Deinen Code angreifen könnte. (auch wenn es noch so unwarscheinlich ist) Und Du musst _jederzeit_ damit Rechnen, dass ein Angreifer schneller als Du ist.

Viele Grüße,
Christian

[1] Und das wirst Du mit ziemlich großer Warscheinlichkeit, denn in solchen Routinen steckt _sehr_ viel Fehlerpotential und auch "Experten" haben da schon häufig Fehler reinprogrammiert. Ich glaube mit zu erinnern, dass strip_tags selbst mal einer Sicherheitslücke hatte, ist aber bestimmt schon sehr lange her.

PS: Ach ja, hier noch ein paar Links:

strip_tags: http://de3.php.net/de/strip_tags
htmlspecialchars: http://de3.php.net/de/htmlspecialchars
mysql_escape_string: http://de3.php.net/de/mysql_escape_string
PEAR::DB: http://pear.php.net/manual/de/core.db.php