Jeod87: Parameter Usereingabe überprüfen

Hallo!

ich richte zur zeit auf einem Server folgendes ein:

ein user kann sich einloggen und dann über eine auswahlmenu bestimmte befehle wie ls oder cat auf dem server ausführen. zusätzlich kann er Parameter übergeben.

Wenn nun aber beispielsweise cat ausgewählt wird und bei Parameter "; rm -R test/" kann man die auswahlliste ja ganz leicht umgehen.

Ich rufe die befehle über exec ()auf.

gibt es ne möglichkeit den befehl direkt aufzurufen und dem server klarzumachen, dass der rest der kommt nur parameter ist sprich dass er z.B.';' nicht zulässt, da dies kein gültiger parameter ist?

momentan filtere ich das in dem ich die parametereingabe nach ungewünschten zeichen filtere  (;, &, >, <, ..) aber da muss es doch was schöneres geben?

gruß
jeod

  1. gibt es ne möglichkeit den befehl direkt aufzurufen und dem server klarzumachen, dass der rest der kommt nur parameter ist sprich dass er z.B.';' nicht zulässt, da dies kein gültiger parameter ist?

    Nein - aber du kannst (solltest wirklich dringen in deinem eigenen interesse) exec() indirekt ausführen

    momentan filtere ich das in dem ich die parametereingabe nach ungewünschten zeichen filtere  (;, &, >, <, ..) aber da muss es doch was schöneres geben?

    Filtern nicht - aber escapen, wenn dir das etwas hilft.

    1. Nein - aber du kannst (solltest wirklich dringen in deinem eigenen interesse) exec() indirekt ausführen

      wie meinst du das mit dem "indirekt"?

      Filtern nicht - aber escapen, wenn dir das etwas hilft.

      escapeshellcmd habe ich schonmal getestet, aber der lässt halt zu wenig durch.

      zb kann ich nicht mehr pingen, weil keine punkte mehr erlaubt sind, ...

      momentan speicher ich den parameter in einem string und überprüfe dann halt auf die oben genannten zeichen, wenn eines davon drin ist, unterbinde ich die ausführung...

      1. escapeshellcmd habe ich schonmal getestet, aber der lässt halt zu wenig durch.

        zb kann ich nicht mehr pingen, weil keine punkte mehr erlaubt sind, ...

        Du hast IMHO doch eher ein ganz grundsätzliches Problem. Entweder überlässt du einem Besucher so einen Shellzugang, dann aber mit allen Konsequenzen, oder du machst es nicht und stellst gewünschte Funktionen anderweitig zur Verfügung, und wenn es auch sein muss, dass du für jede einzelne Funktion die Parameter einzeln annimmst, prüfst und den Aufruf selbst zusammenstellst.

        Mit der allgemeinen Filterei und Maskiererei wird immer hier etwas offen bleiben und dort zu viel verbaut werden. Was du im Moment probierst, ist nichts Halbes und nichts Ganzes.

        1. Du hast IMHO doch eher ein ganz grundsätzliches Problem. Entweder überlässt du einem Besucher so einen Shellzugang, dann aber mit allen Konsequenzen, oder du machst es nicht und stellst gewünschte Funktionen anderweitig zur Verfügung, und wenn es auch sein muss, dass du für jede einzelne Funktion die Parameter einzeln annimmst, prüfst und den Aufruf selbst zusammenstellst. Mit der allgemeinen Filterei und Maskiererei wird immer hier etwas offen bleiben und dort zu viel verbaut werden. Was du im Moment probierst, ist nichts Halbes und nichts Ganzes.

          die ganze sache läuft als projekt und die aufgabensteller verlangen eine sichere freie parameterfunktion. später soll damit ein spezielles programm gesteuert werden.

    2. gibt es ne möglichkeit den befehl direkt aufzurufen und dem server klarzumachen, dass der rest der kommt nur parameter ist sprich dass er z.B.';' nicht zulässt, da dies kein gültiger parameter ist?

      Nein - aber du kannst (solltest wirklich dringen in deinem eigenen interesse) exec() indirekt ausführen

      momentan filtere ich das in dem ich die parametereingabe nach ungewünschten zeichen filtere  (;, &, >, <, ..) aber da muss es doch was schöneres geben?

      Filtern nicht - aber escapen, wenn dir das etwas hilft.

      Oder du lässt die eigentliche funktion mit einer dropdown-liste auswählen und die parameter können dann in einem textfeld daneben eingegeben werden. dann noch einfach jedes ; entfernen, was bei den Parametern eingefügt wird, fertig.

      1. Oder du lässt die eigentliche funktion mit einer dropdown-liste auswählen und die parameter können dann in einem textfeld daneben eingegeben werden. dann noch einfach jedes ; entfernen, was bei den Parametern eingefügt wird, fertig.

        ja so ähnlich mache ich das.

        nur hat ein && beispielsweise den gleichen effekt, und da gibt es vermutlich zig andere sachen mit denen man den Schutz umgehen kann.