Sven Rautenberg: und PHP <- geht das überhaupt?

Beitrag lesen

Yo!

Kannst Du noch was zu passthru() und "feindlichen/bösen" Usereingabe sagen, wäre so ein Szenario (zweiter/veränderter Befehl) möglich, wenn der Scriptpath fix ist, aber die Parameter nicht, oder ist so etwas nur denkbar, wenn auch der Pfad dynamisch erzeugt wird. Ist urlencode() da eine Abhilfe oder nur "Weihwasser".

Gefährlich sind bei Usereingaben die Zeichen, die vom Zielsystem nicht als einfaches Zeichen angesehen werden, sondern Sonderfunktion haben.

Bei SQL ist z.B. das einfache Anführungszeichen gefährlich, da damit die Strings beendet werden, die man an die Datenbank übergibt. Würde es ein Angreifer schaffen, beim Zusammenbau der SQL-Abfrage ein einfaches Anführungszeichen einzuschleusen, würde das den String beenden, und der Rest der Usereingabe wäre beliebiger SQL-Code, der z.B. die Datenbank löscht:

$sqlquery="SELECT * FROM tabelle WHERE spalte LIKE '%$suchstring%'";

Wenn $suchstring folgenden Inhalt hat, dann ist das böse:
$suchstring="quark'; DELETE FROM tabelle WHERE spalte LIKE '";

Zusammengesetzt:
$sqlquery="SELECT * FROM tabelle WHERE spalte LIKE '%quark'; DELETE FROM tabelle WHERE spalte LIKE '%'";

Wäre böse und birgt einiges an Potentiel. Lösung: Die möglicherweise im String enthaltenen Sonderzeichen müssen ihrer besonderen Wirksamkeit enthoben werden - durch escapen dieser Zeichen. addslashes() erledigt das bei Anführungszeichen für Datenbankabfragen. Und escapeshellcmd() erledigt das für Strings, die an die Kommandozeile gehen.

http://www.php.net/manual/en/function.escapeshellcmd.php

Durch Escapen ist sichergestellt, daß das System, welches mit den Daten arbeitet, nicht umgangen werden kann. Du gehst durch deine Programmierung davon aus, daß ein String übergeben wird. Ein String ist nicht böse. Durch Escapen geht das Zielsystem auch nur von einem String aus, weil es keine Befehlsartigen Kommandos enthalten kann.

Natürlich hast du beim Perl-Skript wiederum die Verantwortung, Weitergaben von Strings an Subsysteme (z.B. die Datenbank oder eine Shell) zu escapen.

Generell: Sicherheit bei Usereingaben ist dann gewährleistet, wenn die Usereingaben das bleiben, was sie ursprünglich waren: Daten. Es ist zu verhindern, daß sie zu Befehlen und Programmen mutieren.

- Sven Rautenberg