Una solución simple para determinar la diferencia entre dos funciones similares de PHP es escribir un script de línea de comandos rápido en PHP que genera todo el espacio de búsqueda posible y solo muestra diferencias (en este caso, comparando 256 valores) :
<?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";
}
?>
Ejecución del anteriormente en PHP 5.6 en las salidas de comandos de 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: \ != \\
Ejecutar el mismo guión bajo PHP 5.5 para Linux salidas:
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 diferencia principal es que PHP escapeshellcmd() bajo los prefijos de Windows tiene caracteres con un^en lugar de una barra invertida \. Las rarezas bajo Linux de chr (128) a chr (255) para ambos escapeshellcmd() y escapeshellarg() pueden explicarse mediante el uso de puntos de código UTF-8 inválidos que se descartan, truncan o malinterpretan.
También es de destacar que escapeshellarg() escapa de muchos menos caracteres y aún así hace el trabajo.
En términos de seguridad general del sistema y la aplicación, es mejor que use escapeshellarg() y escape individualmente cada argumento que consiste en la entrada del usuario.
Un último ejemplo:
echo escapeshellarg("something here") . "\n";
echo escapeshellarg("'something here'") . "\n";
echo escapeshellarg("\"something here\"") . "\n";
salidas Windows:
salidas
"something here"
"'something here'"
" something here "
Linux:
'something here'
''\''something here'\'''
'"something here"'
escapeshellarg PHP() en Windows rodea la cadena con la doble cita " carácter mientras que Linux utiliza el carácter de comillas simples. PHP en Windows reemplaza completamente el documento interno Citas electrónicas con espacios (lo que podría ser un problema en algunos casos). PHP en Linux se sale un poco de su camino para escapar de las comillas simples y las barras invertidas \ escapadas \\ en Windows. PHP escapeshellarg() en Windows también reemplaza! y% personajes con espacios. Todas las plataformas reemplazan \ 0 con espacios.
Tenga en cuenta que el comportamiento no es necesariamente coherente entre las versiones de PHP y la documentación de PHP no siempre refleja la realidad. Escribir un guión rápido o leer el código fuente de PHP son dos formas de descubrir lo que sucede detrás de escena.
Esto no es una respuesta. La pregunta era ¿cuáles son las diferencias? – cyphunk
La verdadera pregunta es "¿Cuál debería usar?". Creo que Jay respondió esa pregunta. –