Una soluzione semplice per determinare la differenza tra due funzioni PHP dal suono simile è scrivere un rapido script da riga di comando in PHP che restituisce l'intero spazio di ricerca possibile e mostra solo le differenze (in questo caso, confrontando 256 valori) :
<?php
for ($x = 0; $x < 256; $x++)
{
if (chr($x) !== escapeshellcmd(chr($x))) echo $x . " - cmd: " . chr($x) . " != " . escapeshellcmd(chr($x)) . "\n";
}
echo "\n\n";
for ($x = 0; $x < 256; $x++)
{
if (chr($x) !== substr(escapeshellarg(chr($x)), 1, -1)) echo $x . " - arg: " . chr($x) . " != " . substr(escapeshellarg(chr($x)), 1, -1) . "\n";
}
?>
Esecuzione del sopra sotto PHP 5.6 sulle uscite del prompt dei comandi di Windows:
0 - cmd: !=
10 - cmd:
!=^
33 - cmd: ! != ^!
34 - cmd: " != ^"
35 - cmd: # != ^#
36 - cmd: $ != ^$
37 - cmd: % != ^%
38 - cmd: & != ^&
39 - cmd: ' != ^'
40 - cmd: (!= ^(
41 - cmd: ) != ^)
42 - cmd: * != ^*
59 - cmd: ; != ^;
60 - cmd: < != ^<
62 - cmd: > != ^>
63 - cmd: ? != ^?
91 - cmd: [ != ^[
92 - cmd: \ != ^\
93 - cmd: ] != ^]
94 - cmd:^!= ^^
96 - cmd: ` != ^`
123 - cmd: { != ^{
124 - cmd: | != ^|
125 - cmd: } != ^}
126 - cmd: ~ != ^~
255 - cmd: != ^
0 - arg: !=
33 - arg: ! !=
34 - arg: " !=
37 - arg: % !=
92 - arg: \ != \\
Esecuzione dello stesso script sotto PHP 5.5 per le uscite di Linux:
012.351.641,061 mila
0 - cmd: !=
10 - cmd:
!= \
34 - cmd: " != \"
35 - cmd: # != \#
36 - cmd: $ != \$
38 - cmd: & != \&
39 - cmd: ' != \'
40 - cmd: (!= \(
41 - cmd: ) != \)
42 - cmd: * != \*
59 - cmd: ; != \;
60 - cmd: < != \<
62 - cmd: > != \>
63 - cmd: ? != \?
91 - cmd: [ != \[
92 - cmd: \ != \\
93 - cmd: ] != \]
94 - cmd:^!= \^
96 - cmd: ` != \`
123 - cmd: { != \{
124 - cmd: | != \|
125 - cmd: } != \}
126 - cmd: ~ != \~
128 - cmd: !=
...
255 - cmd: ÿ !=
0 - arg: !=
39 - arg: ' != '\''
128 - arg: !=
...
255 - arg: ÿ !=
La differenza principale è che PHP escapeshellcmd() sotto Windows precede i caratteri con un segno di omissione^invece di una barra rovesciata \. Le stranezze sotto Linux da chr (128) a chr (255) per escapeshellcmd() e escapeshellarg() possono essere spiegate dall'uso di punti di codice UTF-8 non validi che vengono rilasciati, troncati o interpretati erroneamente.
Si noti inoltre che escapeshellarg() riesce a sfuggire molti meno caratteri e continua a svolgere il lavoro.
In termini di sicurezza generale del sistema e dell'applicazione e sicurezza, è meglio usare escapeshellarg() e sfuggire individualmente ad ogni argomento che consiste nell'input dell'utente.
Un ultimo esempio:
echo escapeshellarg("something here") . "\n";
echo escapeshellarg("'something here'") . "\n";
echo escapeshellarg("\"something here\"") . "\n";
uscite Windows:
uscite
"something here"
"'something here'"
" something here "
Linux:
'something here'
''\''something here'\'''
'"something here"'
PHP escapeshellarg() in Windows circonda la stringa con il doppio citazione " personaggio mentre Linux usa il carattere "citazione singola". PHP su Windows sostituisce completamente il doubl interno e-virgolette con spazi (che potrebbe essere un problema in alcuni casi). PHP su Linux fa un po 'a modo suo per sfuggire alle virgolette singole e ai backslash \ sono sfuggiti \\ su Windows. Anche PHP escapeshellarg() su Windows sostituisce! e% caratteri con spazi. Tutte le piattaforme sostituiscono \ 0 con spazi.
Si noti che il comportamento non è necessariamente coerente tra le versioni di PHP e la documentazione di PHP non riflette sempre la realtà. Scrivere un veloce script o leggere il codice sorgente di PHP sono due modi per capire cosa sta succedendo dietro le quinte.
Questa non è una risposta. La domanda era quali sono le differenze. – cyphunk
La vera domanda è "Quale dovrei usare?". Penso che Jay abbia risposto a questa domanda. –