(PHP 4, PHP 5, PHP 7, PHP 8)
escapeshellcmd — Maskiert Metazeichen der Shell
escapeshellcmd() 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.
command
Der zu maskierende Befehl.
Die maskierte Zeichenkette.
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));