<b>REGISTER</b>

GFX-Sector - PHP und MySQL Tutorials


 
GFX-Sector » Coding Area » Coding-Tutorials » PHP und MySQL Tutorials » [PHP/MySQL] PHP-Skripte absichern – Teil 2: XSS » Hello Guest [Login|Register]
Last Post | First Unread Post Print Page | Recommend to a Friend | Add Thread to Favorites

PHP und MySQL Tutorials

Tutorials über die serverseitige Programmierung mit PHP und der Datenbank MySQL
Post New Thread Post Reply

PHP-Skripte absichern – Teil 2: XSS

     Deutsche Version  English version
Author
Post « Previous Thread | Next Thread »

thaseek thaseek is a male
Zauberstabbenutzer


Avatar von thaseek

Registration Date: 25.11.2007
Posts: 15
Location: Heilbronn, BW
Program: Adobe Fireworks CS3

Spacer
PHP-Skripte absichern – Teil 2: XSS

PHP-Skripte absichern – Teil 2: XSS

      

PHP-Skripte absichern – Teil 2: XSS

Hallo zusammen,

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 Wink ). 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 „&lt;“ und „&gt;“ ersetzt werden.
Beispiel:
php:
1:
2:
3:
4:
<?php
   $test htmlentities('<script>');
   echo($test);
?>

bewirkt im HTML-Quelltext:
code:
1:
&lt;script&gt;

und wird ausgegeben als:
<script>

Können wir uns jetzt schon beruhigt zurücklehnen?

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($homepageENT_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 „&amp;“.
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:
php:
1:
2:
3:
4:
<?php
   $test strip_tags('<script>');
   echo($test);
?>

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!



Thanks for this thread by the author

Until now 1 user has thanked
PHP-Skripte absichern – Teil 2: XSS 22.05.2008 22:24 thaseek is offline Search for Posts by thaseek

izak.stern izak.stern is a male
Ohnefiltergrafiker


izak.stern hat kein Avatar

Registration Date: 18.02.2008
Posts: 478

Spacer
      

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*



PHP-Skripte absichern – Teil 2: XSS 22.05.2008 22:39 izak.stern is offline Homepage of izak.stern Search for Posts by izak.stern

Fireball Fireball is a male
Boardchef


Avatar von Fireball

Registration Date: 11.11.2006
Posts: 16,355
Classing-Rank: GFX-Sector
Location: Bremen, Deutschland
Program: Adobe Photoshop CS2
Deviantart: oenismaster
Forums: (alle)

Spacer
      

Finde ich auch sehr schön, dass du nun auch den zweiten Teil deines Tuts gepostet hast smile
Sehr schön beschrieben, gefällt mir!
Vielen Dank smile



PHP-Skripte absichern – Teil 2: XSS 23.05.2008 14:54 Fireball is offline Homepage of Fireball Search for Posts by Fireball

x3ro
Ohnefiltergrafiker


Avatar von x3ro

Registration Date: 24.12.2007
Posts: 250
Location: Hamburg

Spacer
      

quote:
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 großes Grinsen Der Titel des Tutorials lautet XSS, und das hat nunmal nichts mit MySQL zu tun Wink 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^^

@thaseek: Cooles Tutorial smile



PHP-Skripte absichern – Teil 2: XSS 23.05.2008 17:18 x3ro is offline Search for Posts by x3ro

Babbsdrebbler
Weichzeichner


Babbsdrebbler hat kein Avatar

Registration Date: 14.03.2007
Posts: 51

Spacer
      

N1, viele Leute sind sich der Gefahr leider nicht bewusst.
Grade angehende Programmierer sollten das lernen.
Vieles steht aber auch im Wiki vom phpforum Wink

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. Wink

PHP-Skripte absichern – Teil 2: XSS 23.05.2008 20:12 Babbsdrebbler is offline Search for Posts by Babbsdrebbler

x3ro
Ohnefiltergrafiker


Avatar von x3ro

Registration Date: 24.12.2007
Posts: 250
Location: Hamburg

Spacer
      

quote:
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. Wink


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 Wink



PHP-Skripte absichern – Teil 2: XSS 23.05.2008 20:33 x3ro is offline Search for Posts by x3ro

Babbsdrebbler
Weichzeichner


Babbsdrebbler hat kein Avatar

Registration Date: 14.03.2007
Posts: 51

Spacer
      

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.

PHP-Skripte absichern – Teil 2: XSS 24.05.2008 10:06 Babbsdrebbler is offline Search for Posts by Babbsdrebbler

x3ro
Ohnefiltergrafiker


Avatar von x3ro

Registration Date: 24.12.2007
Posts: 250
Location: Hamburg

Spacer
      

quote:
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 Wink



PHP-Skripte absichern – Teil 2: XSS 24.05.2008 16:55 x3ro is offline Search for Posts by x3ro

Babbsdrebbler
Weichzeichner


Babbsdrebbler hat kein Avatar

Registration Date: 14.03.2007
Posts: 51

Spacer
      

IP Blacklists, ausschalten , Traffic Analyse und Paket Filterung oder man lässt die Packete ins Nirvana wandern Wink

Wenn der Server angegriffen wird ist es eigentlich egal ob es mein Script ist oder ein anderes.

Is übrigens nich mein Server.

Stacheldraht lässt grüßen großes Grinsen

PHP-Skripte absichern – Teil 2: XSS 24.05.2008 17:11 Babbsdrebbler is offline Search for Posts by Babbsdrebbler

NEO_2.0 NEO_2.0 is a male
Filtertester


NEO_2.0 hat kein Avatar

Registration Date: 29.04.2011
Posts: 2

Spacer
      

Nettes Tut aber naja WebCoding ScriptKiddy Wink 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 smile

Aber nettes tut Wink

PHP-Skripte absichern – Teil 2: XSS 29.04.2011 11:37 NEO_2.0 is offline Search for Posts by NEO_2.0

Ephraim
Co-Administrator


Avatar von Ephraim

Registration Date: 17.03.2008
Posts: 4,365
Forums: (alle)

Spacer
      

Der Benutzer war schon über ein Jahr nicht mehr auf dem Sector aktiv Wink
Wird denke ich nix draus Zunge raus

PHP-Skripte absichern – Teil 2: XSS 29.04.2011 11:45 Ephraim is offline Search for Posts by Ephraim

cheahzle cheahzle is a male
Love it!


cheahzle hat kein Avatar

Registration Date: 23.12.2007
Posts: 290
Location: Düsseldorf

Spacer
      

Nachm Abi kann ich dazu einen Workshop erstellen, falls Interesse besteht ôô

PHP-Skripte absichern – Teil 2: XSS 29.04.2011 12:43 cheahzle is offline Search for Posts by cheahzle
 
Spacer
   
GFX-Sector
unregistered


 hat kein Avatar


Spacer

Have you enjoyed this topic?


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.)

New Post 29.04.2011 12:43  
Tree Structure | Board Structure
Post New Thread Post Reply
GFX-Sector » Coding Area » Coding-Tutorials » PHP und MySQL Tutorials » [PHP/MySQL] PHP-Skripte absichern – Teil 2: XSS

Similar topics to PHP-Skripte absichern – Teil 2: XSS
Thread
Hilfe! Brauche PHP/HTML/JS Hilfe! (Forum: HTML, CSS)
Wie Funktioniert PHP und MySQL? (Forum: PHP, MySQL)
Welches Netzteil ? (Forum: Multimedia)
Projekt Crokodeal [PHP&MySQL - CMS] (Forum: Werbung)
Php Lernen (Forum: PHP, MySQL)