Mailinglisten-Archive |
Hallo Johann, Vielen Dank für deine Antworten. Kommentar siehe Text unten. From: "Johann-Peter Hartmann" <hartmann_(at)_mayflower.de> > Hi Ivan, > > Ivan Schmid schrieb: > > Als Schutz vor möglichen Cross-Site-Scripting (XSS) Angriffen > > auf unsere > > Web-Applikation möchte ich im Header auf jeder Site ein > > Schutz einbauen. > > Betroffen davon sind eigentlich alle möglichen Header > > Eingaben.( Get, Post, > > Cookie, Session, Put ). > > > > $_ENV, $_GET, $_POST, $_COOKIE, $_SERVER, $_SESSION > > Meist entscheidet man über die > Vertrauenswürdigkeit von HTTP-Daten > nicht nur anhand des Headers und dem > Dateninhalt, sondern vor allem über die > Authentizität der Verbindung und die > Plausibilität des Inhalts. Bemerkung 001: Das ist ja in der Theorie sicher sehr interessant, jedoch nützt mir die Authentizität der Verbindung nicht sehr viel, da 1. die Site frei zugänglich ist und 2. sich die Authentizität auf eine IP-Adresse beschränkt. Ein XCC Angriff kann auf JEDER Seite erfolgen (Bsp: http://target.de?was=<=<scri*pt>JavaScript:alert('document.cookie');</scri*p t> )! > Dh. es sollte feststehen, dass es sich > um den gewünschten Nutzer handelt, > die Inputdaten sollten auf einen > plausiblen Zustandsraum beschränkt werden, > z.B. über reguläre Ausdrücke oder > andere Inhaltsvergleiche wie <= usw. Ja, genau! Für DAS suche ich ja eine KONKRETE Lösung. Der Zustandsraum für einen möglichen Input des Users ist nicht begrenzbar! > > Daneben sollten natürlich nur die Daten > Vertrauensgrenzen überschreiten, bei denen > es tatsächlich notwendig ist. > > > > 1. Die Frage: > > *************** > > Wie könnte ich nun am einfachsten und schnellsten alle diese Variablen > > checken und durch die Funktion make_clean säubern ? > > Was sollte die Funktion make_clean sonst noch alles checken? > > Alles über einen Kamm zu scheren ist > imho unklug, weil man dann den größten > gemeinsamen Nenner benutzen muss. > Statt dessen sollte man Zahleneingaben auf > Ziffern überprüfen, SQL-Parameter auf > SQL-Escapes, HTML-Input auf gültige Tags, > Strings auf maximale Längen usw. . Muss aber sein. Siehe Bemerkung 001 ! > > > *************** > > 2. Mein Vorschlag: > > *************** > > Parameter zum späteren Anzeigen begrenzt > man für gewöhnlich mit strip_tags. Das reicht definitv nicht aus! Der XSS Code kann wirklich sehr tricky angewendet werden! Beispiele: <img src="javascript:alert('Hello world')" /> Ausserdem können alle Zeichen wie </>,javascript,<script> auch noch Codiert auftreten! oder im 'layer' und 'ilayer' Tag oder java script anstelle von javascript ! > > 3. Das Problem: > > *************** > > Wenn es nun keine _GET oder sonstwelche Variable gibt, kommt > > es zu einem > > Parse-Error in der htmlspecialchars Funktion. > ^ > Hmm, das verstehe ich nicht, foreach > sollte bei leeren Arrays die Funktion > nicht aufrufen. > > > > Wenn eine _GET oder sonstwelche Variable nicht ein String > > sondern ein Array > > ist kommt es auch zu einem Parse-Error. > > Die Extract-Funktion für Arrays möchte ich erst nach dem make_clean > > verwenden. > > Kann man dann die Array-Inhalte > injecten, weil die erst nach dem > make_clean rausgeholt werden :o) ? > > > Für gute Verbesserungsvorschläge wäre ich sehr dankbar. > > 1. Mit dem Wissen um die möglichen > Inhalte der Variablen diese prüfen. Genau! Wie sieht dies in der Praxis aus? > > 2. Stefan Esser (http://security.e-matters.de/) > zur Beratung einkaufen ;-) . Wieso nicht! Auch eine gute Idee. Die ultimativste Lösung gibt es dazu eigentlich schon, jedoch braucht diese Lösung 987 Zeilen Code ! Von Konstantin Riabitsev: http://www.mricon.com/html/phpfilter.html Also mein Vorschlag nach wie vor: ( Braucht dringend Verbesserungsvorschläge) function make_clean($value){ $value = htmlspecialchars($value) $value = str_replace("%2B", "", $value); // und so weiter return $value; } if (!empty($_GET)){ foreach( $_GET as $key=>$value ) {$$key = make_clean($value);} } if (!empty($_POST)){ foreach( $_POST as $key=>$value ) {$$key = make_clean($value);} } if (!empty($_SESSION)){ foreach( $_SESSION as $key=>$value ) {$$key = make_clean($value);} } if (!empty($_COOKIE)){ foreach( $_COOKIE as $key=>$value ) {$$key = make_clean($value);} } start_seitenaufbau /IVAN http://www.astalavistagroup.ch/
php::bar PHP Wiki - Listenarchive