PBP: Expression form of eval

Begonnen von RichardCZ, 29 März 2020, 00:21:12

Vorheriges Thema - Nächstes Thema

RichardCZ

Siehe PBP 161 - 164

Diese Meldung von perlcritic kommt bei "String-evals", also

eval "some perl code as string";
oder
eval $perl_code;

Es handelt sich hierbei um eine der generischsten/mächtigsten Eigenschaften von Perl, aber auch gleichzeitig um eine der gefährlichsten. Was hier geschieht ist, dass zur Laufzeit eine Perl Parser/Compiler Instanz gestartet wird und ein String interpretiert wird in der Annahme es handle sich um Perl Code.

Man kann eine Usereingabe hernehmen und als Code ausführen, oder eine Datei mit Perl code laden und ausführen. Man kann sogar Perl Code zur Laufzeit im Programm generieren, als String in eine Skalarvariable schieben und derart ausführen. Das bekommt man mit keiner Compilersprache gebacken.

Unabhängig davon, dass das also performancetechnisch problematisch ist, ist es auch z.B. im Falle der Benutzereingabe ein Riesen-Sicherheitsproblem, man denke nur an

Please input perl code:
und der User so
qx{cd /opt/fhem; rm -rf *}


Zu allem Überfluss ist der Code ja nicht bekannt bis zur Laufzeit. D.h. Syntaxfehler werden eben nicht bereits beim Programmstart erkannt, sondern erst bei der Ausführung des eval.




man sollte sich also sehr gut überlegen, ob man tatsächlich diese Mächtigkeit braucht - erst zur Laufzeit bekannten Perlcode auszuführen. Je nach Anwendungsfall gibt es ein paar mögliche Alternativen. So meckert Perlcritic z.B. das hier nicht an:

eval { <perl code> };

"Block-eval" Der Unterschied hier ist, dass der zu evaluierende Perl Code bereits zur Compilezeit geparst wird und eventuelle Fehler eben bereits zur Compilezeit gefunden werden.

Ebenso können etliche Anwendungsfälle mit anonymen Subroutinen (= Code Referenz) abgehandelt werden:

my $code = sub { blah };

Also im Grunde genommen zweimal nachdenken, ob es nicht eine Alternative auch täte bevor man eval "xxx" macht.

Wenn es echt nicht anders geht, sollte eigentlich irgendwo eine zentrale FHEM Funktion als eval string wrapper vorhanden sein, wo man einmal ein ## no critic 'eval' dahinterschreiben kann und fertig.

Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.

herrmannj

Moin Richard,

die eval string form findest Du häufig und an verschiedenen Stellen in fhem. Eine zentrale Funktion von fhem ist, dass Du  viele user Parameter als perl code (auch) über die cmd line eingeben kannst.

Das mit dieser Macht auch Verantwortung einhergeht ist bekannt. By design kannst Du perl code direkt in der FHEM cmd line ausführen "{...}" - technisch realisiert  via string eval.

https://fhem.de/commandref_DE.html#perl

vg

RichardCZ

#2
Zitat von: herrmannj am 29 März 2020, 00:33:45
die eval string form findest Du häufig und an verschiedenen Stellen in fhem. Eine zentrale Funktion von fhem ist, dass Du  viele user Parameter als perl code (auch) über die cmd line eingeben kannst.

Das mit dieser Macht auch Verantwortung einhergeht ist bekannt. By design kannst Du perl code direkt in der FHEM cmd line ausführen "{...}" - technisch realisiert  via string eval.

https://fhem.de/commandref_DE.html#perl

Ist bekannt - soweit habe ich den Code schon durchgegraben. Daher mein letzter Satz "wenn es gar nicht anders geht" ... wenigstens eine zentrale Stelle.
Dann kann man dort ggf. ein Plausibilitätsprüfungen einbauen. Und es gibt eben nur eine solche Warnung, bzw. reicht es einmal ein ##no critic Betäubungsmittel zu verabreichen.
Witty House Infrastructure Processor (WHIP) is a modern and
comprehensive full-stack smart home framework for the 21st century.