wie man wohl sieht, frage ich mich, an welcher stelle ein
filter am sinnvollsten einzubauen ist. würde bei einem
konstrukt wie
$name=param(‚name‘);
ein evtl. vorhandener befehl schon ausgeführt?
Nein, der würde erst ausgeführt, wenn du dann intelligenterweise noch irgendwas wie system($name) hinterherschieben würdest. Du musst immer bedenken, was mit den Daten passiert. Solange du nur irgendwelche Stringoperationen damit machst, passiert nichts. Kritisch wird es, wenn die Daten in irgendeiner Art an den Rest vom System wandern. Deshalb musst du sämtliche Benutzerdaten immer behandeln wie Giftmüll, wenn du sie z.B. für Datenbankabfragen oder Systembefehle verwenden willst.
Wo wir schon bei Befehlen sind: nehmen wir mal an, du benutzt ls, um an irgendwelche Verzeichniseinträge ranzukommen. Der Benutzer kann über ein Formular in der Variablen „filter“ die Suche einschränken, z.B. mit „a*“ nach allen mit a beginnenden Dateinamen suchen. Der naive Ansatz wäre dann ( Kinder, versucht das nie zuhause! ):
my $filter = param( 'filter' );
# jetzt basteln wir uns irgendwas, um die Ausgabe von ls aufzufangen
# ...
system( "ls -l $filter" );
# ...
So weit so gut. Jetzt schicken wir da mal probehalber als Filter den String „. ; rm -rf .“ rein. Panik bricht aus.
Aus genau dem Grund bietet z.B. DBI das Konstrukt mit nachträglich eingefügten Parametern, die dann entsprechend vorbehandelt werden. Wenn du externe Bibliotheken verwendest solltest du dich immer kundig machen, welche Schnittstellen in dieser Hinsicht als „sicher“ gelten und welche man nur mit Daten fütter sollte, über die man die volle Kontrolle hat.