heute beschäftigen wir uns mit einem weiteren Sicherheitsaspekt bei der Webprogrammierung: dem Cross-Site Scripting (abgekürzt XSS, um Verwechslungen mit den Cascading Style Sheets CSS zu vermeiden, mit denen das XSS weder verwandt noch verschwägert ist
). Derartige Sicherheitslecks werden gerne dazu genutzt, z.B. JavaScript-Code in die Seite einzuschleusen. Von nervenden Popups bis hin zu übermittelten Sitzungsvariablen lässt sich damit dann allerhand Unsinn auf der Seite des Angegriffenen treiben.
Wer HTML in Benutzereingaben zulässt, öffnet also Missbrauch – und zwar längst nicht nur den als Beispiel angeführten Skriptattacken – Tür und Tor.
Um unerwünscht eingefügten Code unschädlich zu machen, gibt es mehrere Lösungsansätze. Zwei davon möchte ich hier vorstellen:
Möglichkeit Nummer Eins: htmlentities()
Die Anwendung dieser Funktion auf den auszugebenden String bewirkt, dass HTML-Tags im Browser als Text ausgegeben werden, indem im Quelltext „<“ und „>“ durch „<“ und „>“ ersetzt werden.
Beispiel:
Mitnichten! Denn htmlentities() berücksichtigt neben der zu verarbeitenden Zeichenkette (string) auch noch ein zweites Argument, „quote style“ genannt. Hier wird festgelegt, wie Anführungszeichen behandelt werden sollen. Standardmäßig – also wenn das Argument einfach weggelassen wird – ist ENT_COMPAT aktiv, was bewirkt, dass nur doppelte Anführungszeichen (“) unschädlich gemacht werden, nicht aber einfache (’).
Um euch klar zu machen, warum das gefährlich ist, folgt an dieser Stelle ein Beispiel:
Nehmen wir einmal an, ihr verarbeitet den „Homepage“-Wert aus einem Gästebuch-Formular und bringt ihn in der Variable $homepage unter.
Im Code steht, um das Ganze auszugeben:
php:
1:
echo ‘<a href=”’.$homepage.’”>Homepage des Benutzers</a>’;
Mit etwas Pech wird ein findiger Angreifer versuchen, hier statt der URL Javascript-Code unterzubringen. Dazu gibt er als Homepage einfach den gewünschten Skript-Code an. Da hier mit einfachen Anführungszeichen gearbeitet werden kann, sind seiner Kreativität kaum Grenzen gesetzt – und wer auf den Link klickt, hat verloren.
Ungemütlich wird es auch dann, wenn ihr bei HTML-Attributen unvorsichtigerweise mit einfachen Anführungszeichen hantiert.
Abhilfe schafft ein anderer „quote style“: ENT_QUOTES.
php:
1:
$homepage = htmlentities($homepage, ENT_QUOTES);
htmlentities() ist allerdings eine vergleichsweise „scharfe“ Funktion und wandelt sämtliche Zeichen, bei denen dies möglich ist, in ihre HTML-Code-Entsprechung um – darunter auch der mitunter erwünschte Ampersand: „&“ wird dann zu „&“.
Das kann einerseits sehr nützlich sein, wenn man beispielsweise einen Contentfilter entwickelt und verhindern möchte, dass gewitzte Benutzer die Sperre gewisser Begriffe umgehen, indem sie die entsprechenden Wörter buchstabenweise als HTML-Code eingeben.
Andererseits wird die rigorose Umwandlung des Ampersands z.B. dann zum Problem, wenn Benutzer beim Ausfüllen eines Formulars Zeichen benutzen, die nicht im Zeichensatz des Formulars enthalten sind (z.B. Chinesisch in einem „Latin“-Formular). Hier erfolgt die Konvertierung in HTML-Sonderzeichen seitens des Browsers – und zwar automatisch und unausweichlich. Wird der Ampersand hier „escaped“, kann das Sonderzeichen beim Auswerten des Formularinhalts nicht mehr korrekt angezeigt werden.
Wer das vermeiden will, wird sich mit regulären Ausdrücken behelfen oder auf das – weniger umfassende – htmlspecialchars() zurückgreifen müssen.
Möglichkeit Nummer Zwei: strip_tags()
Diese Funktion entfernt sämtliche HTML-Tags aus dem als Argument angegebenen String.
Beispiel:
hat keinen Einfluss auf den HTML-Quelltext, da $test hier ein leerer String ist.
Folglich wird auch vom Browser nichts ausgegeben.
Zweierlei ist beim Einsatz von strip_tags() aber zu beachten.
Zunächst einmal ist die zugrunde liegende Definition von einem HTML-Tag nicht sonderlich genau; im Wesentlichen landet alles, was mit „<“ beginnt, im Nirvana. Das kann zu unerwünschten Ergebnissen führen – zum Beispiel, wenn das Zeichen Teil eines mathematischen Ausdrucks („kleiner als“) ist. Es ist also Vorsicht geboten.
Apropos Vorsicht: Die sollte man gleich doppelt walten lassen, wenn man mit dem Gedanken spielt, einzelne Tags, wie „<i>“ oder „<b>“, von der Sperrung auszunehmen, um dem Benutzer eine Formatierungsmöglichkeit an die Hand zu geben.
In diesem Fall sind diese Tags nämlich grundsätzlich zugelassen, auch, wenn sich in einem Attribut wiederum bösartiger Code befindet. Das zu verhindern erfordert einige Klimmzüge mit regulären Ausdrücken; daher ist es wohl vernünftiger, sich ein einfaches „BB-Code“-System zu basteln.
Beide hier vorgestellten Methoden lassen sich natürlich auch bei der Verarbeitung von aus Datenbankabfragen stammenden Arrays verwenden – gesetzt den Fall, die Überprüfung wurde nicht schon vor dem Speichern in der Datenbank durchgeführt.
Ich hoffe, dass der eine oder andere Leser durch dieses Tutorial Neues gelernt hat, bedanke mich einstweilen fürs Lesen und wünsche jetzt viel Spaß beim Ausprobieren!
haettest vllt noch n woertchen zu mysql_real_escape() oder n paar regexps verlieren koennen... find ich aber stark, dass du dir die muehe machst und n "tut" schreibst...
Original von izak.stern
hab nur die codeteile angesehen...
haettest vllt noch n woertchen zu mysql_real_escape() oder n paar regexps verlieren koennen... find ich aber stark, dass du dir die muehe machst und n "tut" schreibst...
*THUMBS UP*
Da muss ich widersprechen
Der Titel des Tutorials lautet XSS, und das hat nunmal nichts mit MySQL zu tun
RegExps wären noch eine mögliche Erweiterung, allerdings auch nur wenn man wirklich absolut jede Falscheingabe ausschließen will. Meiner Meinung nach macht es aber schon Sinn RegExps hier nicht zu behandeln, denn nach meiner Erfahrung verstehen Anfänger diese eher nicht^^
N1, viele Leute sind sich der Gefahr leider nicht bewusst.
Grade angehende Programmierer sollten das lernen.
Vieles steht aber auch im Wiki vom phpforum
Das nächste wird dann Session Sicherheit?
Oder soll ich das machen?^^
Zum Glück habe ich ein System das alle POST und GET Parameter per RegExp und normaler Suche überprüft.
Ich muss nur noch schauen, dass er auch mehrdimmensionale Arrays durchläuft, vll. mit rekursion.
Original von Babbsdrebbler
Zum Glück habe ich ein System das alle POST und GET Parameter per RegExp und normaler Suche überprüft.
Ich muss nur noch schauen, dass er auch mehrdimmensionale Arrays durchläuft, vll. mit rekursion.
Damit kannst du dann aber recht schnelle Probleme kriegen wenn dich jemand nicht mag... Ganz einfach DDoS mit sehr vielen Elementen im Post/Get, und dein Server/Webspace ist sehr schnell lahmgelegt. Das passiert natürlich nur wenn du wirklich den kompletten _POST und _GET Array durchgehst^^ Solltest du drauf achten
Danke für den Tipp, werde ich noch beheben.
Aber ich denke nicht, dass jemand auf die Idee kommt DDOS oder DOS Attaken gegen das Script zu machen, und wenn doch hab ich immernoch die Schutzmaßnahmen des Servers.
Original von Babbsdrebbler
Danke für den Tipp, werde ich noch beheben.
Aber ich denke nicht, dass jemand auf die Idee kommt DDOS oder DOS Attaken gegen das Script zu machen, und wenn doch hab ich immernoch die Schutzmaßnahmen des Servers.
Welche Schutzmaßnahmen bietet dein Server gegen DDoS?^^ Nur mal so aus Interesse
Nettes Tut aber naja WebCoding ScriptKiddy
Kannst ja mal ein SQLi Tut machen oder ein RFI/LFI, Cross Frame Scripting, CRLF-Injection, URL-Jumping, XPathInjection, LDAP Injection, SQL BlindInjection, Code Executuin , ... Kannst dich ja gerne mal bei mir welden
If you were enjoying this post and if you keen on reading more interesting stuff then do not hesitate to complete the free sign up.
After the free registration you will gain access to all areas and you will be able to communicate with other artists from all over the world.
In addition you will benefit from our Photoshop and coding section as well as from our huge (hundreds of gigabytes) free resource section where you can find everything you will need to be a successful (web) designer/artist.
Sign up now and enjoy the advantages as a registered member.
(This website will be ad-free after a complete free sign up.)