wieso man die Funktion system meiden soll
-
aus kingruedis ISO C FAQ
Warum sollte man kein oder nur in wenigen Fällen system() einsetzen?system() ist zwar eine standard Funktion, aber die Parameter sind total Platform abhängig! Deswegen sollte man auf system() genauso versuchen zu verzichten, wie auf Systemfunktionen! Und wenn man mal auf die Idee kommt system() zu benuzten, sollte man lieber die passende Systemfunktion nutzen als ein system() aufruf! Einerseits, kann man Systemfunktions aufrufe auf anderen Platformen leicht emulieren und system() ist sehr teuer und gefaehrlich, da immer eine Shell gestartet wird und die Shell zum Beispiel das Programm einfach unterbrechen kann oder informationen ausgeben!
Wichtig ist auch, dass für system() jedes mal eine neue Shell gestartet wird und nach dem Aufruf von system() beendet wird (was natürlich sehr langsam ist!), also nützt das Verändern von zB Umgebungsvariablen (was man auch standard konform mit putenv(3) machen kann) nichts, da sie wieder verschwinden!
system() hat außerdem das Problem, dass das Programm hängen bleiben kann, wenn der Parameter falsch war und die Shellwartet, dass der User reagiert!
Außerdem kann system() zu einem Sicherheitsloch führen, wenn man zum Beispiel ein CGI Programm schreibt und dann mit system() einen Aufruf zum Beispiel zum durchsuchen einer Datei mit den Benutzereingaben durchführt
ostringstream a; a << "grep " << userinput << " db"; system( a.str().c_str() );
so könnte der User von einem anderen Host einfach Shellmetha Zeichen benutzen, die fast jeder Shell hat, um weitere Befehle auszuführen, die die CGI, dann mit den Rechten des Programmes ausführt. Ein Beispiel sei hier nur die Eingabe von "; rm -rf / ; echo "!
Weiter Infos: http://www.whitefang.com/sup/secure-faq.html#INPUT3
[ Dieser Beitrag wurde am 24.02.2003 um 02:43 Uhr von Dimah editiert. ]