Prüfen ob Strings etwas Unerlaubtes machen
Verfasst: Sonntag 4. Oktober 2009, 18:43
Hallo,
manchmal steht man vor dem Problem, was man mit beliebigen Nutzereingaben machen soll, wenn man diese danach ausführen möchte (Beispiel: konsolenbasierter Taschenrechner). Parst man sie in eine eigene Struktur oder vertraut man darauf, dass der User schon nichts Dummes anstellen wird? Letzteres ist natürlich reichlich naiv und nicht zu empfehlen.
Aus diesem Grund habe ich "Watchdog", den Wachhund, angefangen, der das in Python 2.6 dazugekommene AST-Modul nutzt, um Strings in Python-Grammatik zu übersetzen und Alarm schlägt (Exception), wenn etwas Verbotenes (z.B. der Import eines Moduls) im String vorkommt.
Das Ganze läuft so, dass man je eine Liste mit den erlaubten Namen für den Import und den Namen für `call()` übergibt. Mehr hab ich noch nicht, aber weitere sollen folgen. Wenn man von einer Art nichts übergibt, ist dementsprechend alles verboten (also z.B. jeglicher Import).
`Watchdog` kommt mit einer `Visitor`-Klasse, die jeden Knoten im AST-Baum auf die besagten Regeln hin überprüft und gegebenenfalls eine Ausnahme wirft. Sie erwartet ein `ast.Node`-Objekt, von dem aus sie startet. Zur Vereinfachung gibt es noch eine Funktion, die einen String nimmt, das AST-gerechte Parsen erledigt und anschließend den Visitor startet. Wenn alles gut geht, wird der String in seiner ursprünglichen Form zurückgegeben, ansonsten gab's ja die Exception. So sollen Konstrukte wie `eval(check_string(raw_input('Input: ')))` möglich sein.
Wie gesagt: Noch gibt es sicherlich reichlich Fälle, wo man das irgendwie umgehen kann. Ich werde das noch austesten. Hier erstmal der Code.
manchmal steht man vor dem Problem, was man mit beliebigen Nutzereingaben machen soll, wenn man diese danach ausführen möchte (Beispiel: konsolenbasierter Taschenrechner). Parst man sie in eine eigene Struktur oder vertraut man darauf, dass der User schon nichts Dummes anstellen wird? Letzteres ist natürlich reichlich naiv und nicht zu empfehlen.
Aus diesem Grund habe ich "Watchdog", den Wachhund, angefangen, der das in Python 2.6 dazugekommene AST-Modul nutzt, um Strings in Python-Grammatik zu übersetzen und Alarm schlägt (Exception), wenn etwas Verbotenes (z.B. der Import eines Moduls) im String vorkommt.
Das Ganze läuft so, dass man je eine Liste mit den erlaubten Namen für den Import und den Namen für `call()` übergibt. Mehr hab ich noch nicht, aber weitere sollen folgen. Wenn man von einer Art nichts übergibt, ist dementsprechend alles verboten (also z.B. jeglicher Import).
`Watchdog` kommt mit einer `Visitor`-Klasse, die jeden Knoten im AST-Baum auf die besagten Regeln hin überprüft und gegebenenfalls eine Ausnahme wirft. Sie erwartet ein `ast.Node`-Objekt, von dem aus sie startet. Zur Vereinfachung gibt es noch eine Funktion, die einen String nimmt, das AST-gerechte Parsen erledigt und anschließend den Visitor startet. Wenn alles gut geht, wird der String in seiner ursprünglichen Form zurückgegeben, ansonsten gab's ja die Exception. So sollen Konstrukte wie `eval(check_string(raw_input('Input: ')))` möglich sein.
Wie gesagt: Noch gibt es sicherlich reichlich Fälle, wo man das irgendwie umgehen kann. Ich werde das noch austesten. Hier erstmal der Code.