phpbar.de logo

Mailinglisten-Archive

[php] Cross-Site-Scripting (XSS) Schutz mit PHP

[php] Cross-Site-Scripting (XSS) Schutz mit PHP

Ivan Schmid php_(at)_phpcenter.de
Thu, 10 Oct 2002 22:43:25 +0200


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