Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/05/2003, 17:59
Avatar de mveraa
mveraa
 
Fecha de Ingreso: diciembre-2002
Ubicación: santiago-chilito
Mensajes: 1.931
Antigüedad: 21 años, 3 meses
Puntos: 2
informe de seguridad de php "variables globales"

--- < 3. Variables Globales > ------------------------------------------------

Como mencionamos anteriormente, las variables en PHP no se declaran, son
automaticamente creadas la primera vez que se usan. Se les pone el tipo
automaticamente basada en contexto que son usadas. Esto es una forma muy
conveniente de hacer las cosas desde la perspectiva del programador ( y
obviamente es un herramienta escencial en un lenguaje de desarrllo de
aplicaciones rapido ). Una vez creadas las variables pueden ser referenciadas
desde cualquier parte del programa ( excepto en funciones donde debe ser
explicitamente incluida con el 'global' (funci¢n). El resultado de estas
caracter¡sticas es que las variables son casi nunca inicializadas por el
programador, despu‚s de todo, cuando son creadas est n vac¡as ( ej. "").

Obviamente el Main de una aplicaci¢n web basadas en PHP toma alguna entrada del
cliente ( variables de formulario, upload de archivos, cookiw etc),
Procesa la entrada y devuelve una salida basada en esa entrada. Para hacerlo lo
mas simple posible la entrada casi siempre es proveida en la forma de variables
globales. Como en este codigo html:

<FORM METHOD="GET" ACTION="test.php">
<INPUT TYPE="TEXT" NAME="hello">
<INPUT TYPE="SUBMIT">
</FORM>

Esto mostrar un text box y un boton de submit. Cuando el usuario aprieta el
bot¢n de submit el script de PHP test.php se ejecuta para procesar la entrada.
Cuando se ejecuta la variable $hello contendr el texto que el usuario puso en
el text box. Es importante darse cuenta las implicaciones de esto £ltimo, esto
quiere decir que un atacante desde remoto puede crear cualquier variable que
desee y tenerla declarada como global. Si encambio de usar el form anterior para
llamar a test.php, el atacante llama directamente a la url como
"http://server/test.php?hello=hi&setup=no", no solo ser $hello="hi" cuando el
script se ejecute sino que $setup ser "no" tambi‚n.

Un ejemplo dde como esto puede ser realmente un problema real es en un script
que fue dise¤ado para autentificar a usuarios antes de mostrarlo informaci¢n
importante. Por ejemplo:

<?php
if ($pass == "hello")
$auth = 1;
...
if ($auth == 1)
echo "some important information";
?>

En una operaci¢n normal el c¢digo se fijar el password para decidir si el
usuario debe ser autentificado. Despu‚s se fija si ya fue autentificado y
muestra un informaci¢n importante. El problema radica en que el c¢digo
incorrectamente asume que la variable $auth estar vac¡a a menos que se llene
desde ah¡. Recordando que un atacante puede crear variables como globales, una
url como 'http://server/test.php?auth=1' haria que falle la autentificaci¢n del
password pero igualmente el script crea que estoy autentificado.

Para redondear lo anterior, un script PHP no puede confiar en ninguna variable
si no fue expl¡citamente asignada. Cuando uno tiene un gran numero de variables,
esto puede ser una tarea muy ardua.

Una aproximaci¢n para proteger un script es fijarse que variables no est n en el
array HTTP_GET/POST_VARS[] (dependiendo del m‚todo que se use para enviar el
formulario GET o POST ). Cuando se configura PHP con track_vars enabled ( como
lo es como default ) las variables enviadas por el usuarios estan disponibles en
dos lugares, como variables globales y tambi‚n como elementos de un array que
mencionamos anteriormenet. Igualmente, es importante darse cuenta de que hay
cuatro arrays diferentes para la entrada del usuario, HTTP_GET_VARS para las
variables enviadas en la URL de la pericion GET, HTTP_POST_VARS para las
variables enviadas de manera POST, HTTP_COOKIW_VARS para las variables enviadas
como parte del header de cookies y de una manera limitada el HTTP_POST_FILES (
en las versiones mas recientes de PHP ).
Un script seguro tiene que fijarse en los 4 arrays.


"No man burdens his mind with small matters unless he has some very good
reason for doing so." - John Watson