2009-06-11 2 views
14

Sto codificando un'interfaccia web in un orribile software propiziatorio utilizzato dalla nostra azienda. Il software non ha un'interfaccia utente reale e ci impone di dare accesso al nostro sistema per far sì che i nostri clienti possano persino estrarre dati. La mia interfaccia web deve eseguire una funzione exec(); e deve passare alcune variabili immesse dall'utente.Il modo migliore per disinfettare il comando exec con le variabili inserite dall'utente

$command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'"; 
$last_line = exec($command, $output, $returnvalue); 

Ora presumo che potrei essere in grado di rimuovere un qualsiasi punto e virgola dalla $command varible ed essere al sicuro, ma non sono sicuro ed è per questo che sto in posa questo qui prima di andare in diretta il mese prossimo.

Quale sarebbe il modo migliore per disinfettare $command? Ci sono alcuni caratteri speciali che ho bisogno di essere nelle variabili [ ] < > ! # $.

risposta

17

utilizzare la funzione che PHP ha per questo scopo:

$cmd = 
    "/usr/bin/do-something " . 
    escapeshellarg($arg1) . 
    ' ' . 
    escapeshellarg($arg2); 

È inoltre possibile utilizzare escapeshellcmd()

Qual è la differenza?

escapeshellarg() SOLO aggiunge "intorno alla stringa e quindi \ prima di qualsiasi altro carattere". http://www.php.net/escapeshellarg

escapeshellcmd() sfugge a tutti i caratteri sensibili alla shell ($, \, ecc.) Ma non aggiunge virgolette. http://www.php.net/manual/en/function.escapeshellcmd.php

Il getcha è nel caso in cui si utilizzi escapeshellarg() come PARTE DI UN parametro QUOTED. Quindi è reso inutile (aggiungendo effettivamente citazioni al mix).

In generale, preferiamo utilizzare escapeshellcmd() con le nostre citazioni aggiunte.

$cmd = 
    "/usr/bin/do-something '" . 
    escapeshellcmd($arg1) . 
    "' '" . 
    escapeshellcmd($arg2) . 
    "'"; 

Essere sicuri!

+3

Eliminata la mia risposta perché a quanto pare stavamo digitando contemporaneamente, ma avete fornito esempi decenti. Collegamenti al manuale: http://us.php.net/manual/en/function.escapeshellarg.php, http://us.php.net/manual/en/function.escapeshellcmd.php –

+0

Grazie, @ AC - aggiungendo i collegamenti ora – gahooa

+1

Solo una nota che 'escapeshellcmd()' in realtà non scappa '!', quindi se stai eseguendo il comando in es. Bash, sei ancora vulnerabile alla sostituzione dei comandi (ad es. 'This-is-a-test-! 467' dove'! 467' sarà sostituito da qualsiasi cosa sia il numero 467 nella cronologia della shell). 'escapeshellarg()' lo allevia. – madsen