Der beste Weg, exec Befehl mit Benutzer eingefügt Variablen zu sanieren
Frage
Ich bin Codierung eine Web-Schnittstelle zu einem schrecklichen Stück versöhnender Software nutzt unser Unternehmen. Die Software hat keine wirkliche UI und verlangt von uns, Kitt Zugang zu unserem System für unsere Kunden zu geben, selbst Daten zu ziehen. Mein Web-Interface verfügt über eine exec();
Funktion laufen und es hat ein paar Variablen, die die Benutzereingaben zu übergeben.
$command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'";
$last_line = exec($command, $output, $returnvalue);
Jetzt gehe ich davon aus, ich könnte nur alle Semikolons aus dem $command
varible entfernen und sicher sein, aber ich bin nicht sicher, und das ist, warum ich das hier bin posieren vor der wir leben im nächsten Monat gehen.
Was wäre der beste Weg, $command
zu sanieren? Es gibt ein paar Sonderzeichen, die brauche ich in der Variablen [ ] < > ! # $
sein.
Lösung
die Funktion verwenden, die PHP für diesen Zweck hat:
$cmd =
"/usr/bin/do-something " .
escapeshellarg($arg1) .
' ' .
escapeshellarg($arg2);
Sie können auch verwenden escapeshellcmd()
Was ist der Unterschied?
escapeshellarg()
fügt nur 'um die Zeichenfolge und dann \ bevor andere Charaktere.
http://www.php.net/escapeshellarg
escapeshellcmd()
entkommt alle Shell empfindlichen Zeichen ($, \, etc ..), aber nicht hinzufügen, zitiert.
http://www.php.net/manual/en/function.escapeshellcmd.php
Die Gotcha ist in dem Fall, dass Sie escapeshellarg()
als Teil eines QUOTED Parameter verwenden. Dann wird es unbrauchbar gemacht (eigentlich Anführungszeichen in den Mix).
Im Allgemeinen bevorzugen wir escapeshellcmd()
mit unseren eigenen Anführungszeichen verwenden hinzugefügt.
$cmd =
"/usr/bin/do-something '" .
escapeshellcmd($arg1) .
"' '" .
escapeshellcmd($arg2) .
"'";
Seien Sie sicher!