escapeshellcmd
(PHP 4, PHP 5, PHP 7, PHP 8)
escapeshellcmd — Maskiert Metazeichen der Shell
Beschreibung
$command
): stringescapeshellcmd() maskiert alle möglichen Zeichen in einer Zeichenkette, die dazu benutzt werden könnten, um einen Shellbefehl zur Durchführung beliebiger Befehle zu veranlassen. Diese Funktion sollte verwendet werden, um sicherzustellen, dass alle Daten aus einer Benutzereingabe maskiert werden, bevor diese Daten zu einer der Funktionen exec(), system() oder dem Backtick-Operator übergeben werden
Folgenden Zeichen wird ein Backslash vorangestellt:
&#;`|*?~<>^()[]{}$\
, \x0A
und \xFF
. '
und "
werden nur maskiert, wenn sie nicht paarweise auftreten. Unter Windows wird
all diesen Zeichen sowie %
und !
ein
Caret-Zeichen (^
) vorangestellt.
Parameter-Liste
-
command
-
Der zu maskierende Befehl.
Rückgabewerte
Die maskierte Zeichenkette.
Beispiele
Beispiel #1 escapeshellcmd()-Beispiel
<?php
// Wir erlauben hier absichtlich eine beliebige Anzahl von Argumenten
$command = './configure '.$_POST['configure_options'];
$escaped_command = escapeshellcmd($command);
system($escaped_command);
?>
escapeshellcmd() sollte auf die gesamte Befehls-Zeichenkette angewendet werden. Trotzdem kann der Angreifer damit eine beliebige Anzahl von Argumenten übergeben. Um einzelne Argumente zu maskieren, sollte stattdessen escapeshellarg() verwendet werden.
Leerzeichen werden von escapeshellcmd() nicht maskiert,
was unter Windows bei Pfaden wie
C:\Program Files\ProgramName\program.exe
problematisch
sein kann. Dies kann mit dem folgenden Codeschnipsel entschärft werden:
<?php
$cmd = preg_replace('`(?<!^) `', '^ ', escapeshellcmd($cmd));
Siehe auch
- escapeshellarg() - Maskiert eine Zeichenkette (String), um sie als Shell-Argument benutzen zu können
- exec() - Führt ein externes Programm aus
- popen() - Öffnet einen Dateizeiger für einen Prozess
- system() - Führt ein externes Programm aus und zeigt dessen Ausgabe an
- Backtick-Operator