Вы находитесь на странице: 1из 6

Una funcin para resumir las tareas de declaracin de las variables llegadas por POST en PHP, pero conservando

la seguridad de no utilizar register_globals.

19/1/06 - La idea de este artculo es realizar una funcin que nos simplifique la tarea de recibir en variables los datos que nos llegan desde un formulario por el mtodo POST, pero asegurando nuestra aplicacin, para no declarar como variable aquello que no estamos esperando. Ya hicimos una primera aproximacin a este objetivo en el artculo Bucle para recibir todas las variables por POST en PHP. Aunque la solucin propuesta en dicho artculo no era del todo adecuada, por hacer ms vulnerable nuestro script, ya que rebaja la seguridad de nuestro cdigo como si utilizsemos register_globals = on.
Nota:Podemos saber qu es esto de register_globals y por qu afecta a la seguridad de nuestras aplicaciones PHP en la FAQ: register_globals y seguridad en PHP

El ejemplo que estamos tratando slo recibe las variables por POST que nosotros esperamos recibir y no todas las variables que el formulario pueda contener, lo que realmente mejora la seguridad. Para ello, la funcin recibe_post() va a recibir un parmetro con los nombres de las variables que debe declarar con los datos del formulario. Como nosotros decidimos qu variables se reciben, ya no corremos el riesgo que un usuario malicioso enve otros campos por el formulario que luego se conviertan en variables en nuestro sistema. Veamos el cdigo de esta funcin:
function recibe_post($datos_recibir=""){ if ($datos_recibir==""){ foreach($_POST as $nombre_campo => $valor){ $asignacion = "\$GLOBALS[\"" . $nombre_campo . "\"]='" . $valor . "';"; eval($asignacion); } }else{ //es que recibo por parmetro la lista de campos que deseo recibir $campos = explode(",", $datos_recibir); foreach($campos as $nombre_campo){ $asignacion = "\$GLOBALS[\"" . $nombre_campo . "\"]=\$_POST[\"" . $nombre_campo . "\"];"; eval($asignacion); } } }

Esta funcin recibe una variable llamada $datos_recibir, que contiene los datos que se desean recibir. Ese dato es opcional, ya que si no recibe nada, se entiende que $datos_recibir vale "". Lo primero que se hace es evaluar si $datos_recibir es un string vaco. Si es as, es que no se ha indicado qu es lo que se quiere recibir. Entonces, se recibe por formulario todo lo que haya. (Ntese que si no enviamos nada en ese parmetro se estarn recibiendo todos los datos que haya en el formulario y nuestra aplicacin ver mermada la seguridad). Ahora bien, si se recibe algo en $datos_recibir, es que sabemos qu datos se desean declarar como variables. En ese caso, estaremos recibiendo un string con todos los nombres de los campos del formuario que deseamos recibir, separados por comas. Imaginemos que tenemos un formulario con dos campos, uno llamado "nombre_usuario" y otro "edad_usuario". Entonces, a esta funcin tenemos que

pasarle esos dos nombres de campos separados por comas "nombre_usuario,edad_usuario". Para realizar las tareas de declaracin de las variables, se crea un array con todos los campos recibidos por parmetro. Para ello se utiliza la funcin explode(), que recibe un separador y un string y devuelve un array de strings, donde cada cadena es un substring del string recibido por parmetro, acotados por el separador indicado. La funcin explode se explica mejor con un ejemplo: La funcin recibe dos parmetros: explode($separador, $cadena). Si la llamsemos as: explode("|", "pepe|juan|luis") Nos generara un array donde el primer campo (ndice 0) tendra el substring "pepe", el segundo campo sera "juan" y el tercero "luis". Una vez disponemos del array con todos los nombres de los campos que se desean recibir, se hace un recorrido de ese array para obtener cada uno de sus valores y se declaran como variables los datos que contiene el formulario para cada uno de los campos a recibir. Para ello, primero se crea un string con el cdigo PHP necesario para declarar esa variable, utilizando el array $GLOBALS, para asegurarnos que la variable se crea global a la pgina en lugar de local a la funcin. Luego se utiliza eval() para ejecutar el cdigo generado para declarar la variable. Hay ms explicaciones sobre este ltimo paso en el artculo precedente: Bucle para recibir todas las variables por POST en PHP Con esto hemos terminado este cdigo, que se puede utilizar para recibir sin mucho esfuerzo formularios muy grandes. Lo malo es que si cambiamos o aadimos un campo en el formulario, tambin tenemos que cambiar el cdigo de llamada a esta funcin, para que se entere bien sobre las variables que tiene que recibir. La parte buena, es que la funcin no afecta a la seguridad de nuestras aplicaciones, ya que somos nosotros quienes deciden qu variables se esperan del formulario.

Procesar variables de formularios

Veremos cmo transferir variables de una pgina a otra por medio de formularios

Este tipo de transferencia es de gran utilidad ya que nos permite interaccionar directamente con el usuario. El proceso es similar al explicado para las URLs. Primeramente, presentamos una primera pgina con el formulario clsico a rellenar y las variables son recogidas en una segunda pgina que las procesa:

Nota: No siempre se definen automticamente las variables recibidas por el formulario en las pginas web, depende de una variable de configuracin de PHP: register_globals, que tiene que estar activada para que as sea. Ver comentarios del artculo al final de la pgina para ms informacin.

<HTML> <HEAD>

<TITLE>formulario.html</TITLE> </HEAD> <BODY> <FORM METHOD="POST" ACTION="destino2.php"> Nombre<br> <INPUT TYPE="TEXT" NAME="nombre"><br> Apellidos<br> <INPUT TYPE="TEXT" NAME="apellidos"><br> <INPUT TYPE="SUBMIT"> </FORM> </BODY> </HTML>

<HTML> <HEAD> <TITLE>destino2.php</TITLE> </HEAD> <BODY> <? echo "Variable \$nombre: $nombre <br>\n"; echo "Variable \$apellidos: $apellidos <br>\n" ?> </BODY> </HTML> Ejecutar ejemplo $HTTP_POST_VARS Recordamos que es posible recopilar en una variable tipo array el conjunto de variables que han sido enviadas al script por este mtodo a partir de la variable de sistema $HTTP_POST_VARS. echo "Variable \$nombre: " . $HTTP_POST_VARS["nombre"] . "<br>\n"; Nota: Aunque podamos recoger variables con este array asociativo o utilizar directamente las variables que se definen en nuestra pgina, resulta ms seguro utilizar $HTTP_POST_VARS por dos razones, la primera que as nos aseguramos que esa varible viene realmente de un formulario y la segunda, que as nuestro cdigo ser ms claro cuando lo volvamos a leer, porque quedar especificado que esa variable estamos recibindola por un formulario. $_POST A partir de PHP 4.1.0 se pueden recoger las variables de formulario utilizando tambin el array asociativo $_POST, que es el mismo que $HTTP_POST_VARS, pero ms corto de escribir. Ejemplo de restriccin de acceso por edad Para continuar aportando ejemplos al uso de formularios vamos a realizar una pgina que muestra solicita la edad del visitante y, dependiendo de dicha edad, permita o no visualizar el contenido de la web. A los mayores de 18 aos se les permite ver la pgina y a los menores no. El ejemplo es muy sencillo y no valdra tal cual est para utilizarlo a modo de una verdadera restriccin de acceso. nicamente nos sirve para saber cmo obtener datos de un formulario y como tratarlos para realizar una u otra accin, dependiendo de su valor. La pgina del formulario, que hemos llamado edad.php tendra esta forma: <html> <head>

<title>Restringir por edad</title> </head> <body> <form action="edad2.php" method="post"> Escribe tu edad: <input type="text" name="edad" size="2"> <input type="submit" value="Entrar"> </form> </body> </html> Esta es una pgina sin ningn cdigo PHP, simplemente tiene un formulario. Fijmonos en el action del formulario, que est dirigido hacia una pgina llamada edad2.php, que es la que recibir el dato de la edad y mostrar un contenido u otro dependiendo de ese valor. Su cdigo es el siguiente: <html> <head> <title>Restringir por edad</title> </head> <body> <? $edad = $_POST["edad"]; echo "Tu edad: $edad<p>"; if ($edad < 18) { echo "No puedes entrar"; }else{ echo "Bienvenido"; } ?> </body> </html> Esperamos que este otro cdigo tampoco resulte extrao. Simplemente se recibe la edad, utilizando el array $_POST. Luego se muestra la edad y se ejecuta una expresin condicional en funcin de que la edad sea menor que 18. En caso positivo (edad menor que 18), se muestra un mensaje que informa de que no se deja acceder al pgina. En caso negativo (mayor o igual a 18) se muestra un mensaje de bienvenida. Podemos ver el ejemplo en funcionamiento.

Alineacin de imgenes con HTML


Explica la manera de alinear la imagen dentro de la pgina: centrarla, colocarla a la derecha, a la izquierda, etc.

Vimos en su momento el atributo align que nos permita alinear el texto a derecha, izquierda o centro de nuestra pgina. Dijimos que este atributo no era exclusivo de la etiqueta <p> sino que poda ser encontrado en otro tipo de etiquetas. Pues bien, <img> resulta ser una de esas etiquetas que aceptan este atributo aunque en este caso el funcionamiento resulta ser diferente. Para alinear una imagen horizontalmente podemos hacerlo de la misma forma que el texto, es decir, utilizando el atributo align dentro de una etiqueta <p> o <div>. En este caso, lo que incluiremos dentro de esa etiqueta ser la imagen en lugar del texto: Este cdigo mostrar la imagen en el centro:

<div align="center"><img src="logo.gif"></div> Quedara as:

Sin embargo, ya hemos dicho que la etiqueta <img> puede aceptar el atributo align. En este caso, la utilidad que le damos difiere de la anterior. El hecho de utilizar el atributo align dentro de la etiqueta <img> nos permite, en el caso de darle los valores left o right, justificar la imagen del lado que deseamos a la vez que rellenamos con texto el lado opuesto. De esta forma embebemos nuestras imgenes dentro del texto de una manera sencilla. Aqu podis ver el tipo de cdigo a crear para obtener dicho efecto: <p> <img src="imagen.gif" align="right">Texto tan extenso como queramos que cubrir la parte izquierda de la imagen. Sigo poniendo texto para que se vea el efecto, Bla bla bla bla bla bla bla... </p> Quedara as: Texto tan extenso como queramos que cubrir la parte izquierda de la imagen. Sigo poniendo texto para que se vea el efecto, Bla bla bla bla bla bla bla... <p> <img src="imagen.gif" align="left">Texto tan extenso como queramos que cubrir la parte derecha de la imagen. Sigo poniendo texto para que se vea el efecto, Bla bla bla bla bla bla bla... </p> Quedara as: Texto tan extenso como queramos que cubrir la parte izquierda de la imagen. Sigo poniendo texto para que se vea el efecto, Bla bla bla bla bla bla bla...

Si en algn momento desesemos dejar de rellenar ese espacio lateral, podemos pasar a una zona libre introduciendo un salto de lnea <br> dentro del cual aadiremos un atributo: clear As, etiquetas del tipo: <br clear="left"> Saltara verticalmente hasta encontrar el lateral izquierdo libre. <br clear="right"> Saltara verticalmente hasta encontrar el lateral derecho libre. <br clear="all"> Saltar verticalmente hasta encontrar ambos laterales libres. Ejemplo de clear: Texto tan extenso como queramos que cubrir la parte izquierda. Esto est debajo de la imagen. Existen otro tipo de valores que puede adoptar el atributo align dentro de la etiqueta <img>. Estos son relativos a la alineacin vertical de la imagen. Supongamos que escribimos una lnea al lado de nuestra imagen. Esta lnea puede quedar por ejemplo arriba, abajo o al medio de la imagen. Asimismo, puede que en una misma lnea tengamos varias imgenes de alturas diferentes que pueden ser alineadas de distintas forms. Estos valores adicionales del atributo align son: top Ajusta la imagen a la parte ms alta de la lnea. Esto quiere decir que, si hay una imagen ms alta, ambas imgenes presentaran el borde superior a la misma altura. bottom Ajusta el bajo de la imagen al texto. Absbottom Colocara el borde inferior de la imagen a nivel del elemento ms bajo de la lnea. middle Hace coincidir la base de la lnea de texto con el medio vertical de la imagen. absmiddle Ajusta la imagen al medio absoluto de la lnea. Estas explicaciones, que pueden resultar un poco complicadas, pueden ser ms fcilmente asimiladas a partir con un poco de practica. Nos queda explicar como introducir debajo de la imagen un pie de foto o explicacin. Para ello tendremos que ver antes de nada las tablas, en el prximos captulos...

Вам также может понравиться