Vous êtes sur la page 1sur 9

Funciones de usuario en PHP

PHP tiene toneladas de funciones listas para su uso. Nosotros podemos adems hacer nuestras propias funciones. Una funcin de usuario en PHP no es mas que una porcin de cdigo que podemos llamar en cualquier momento. De un lado, al dividir nuestro cdigo en funciones podemos aislar y perfeccionar cada una de sus funcionalidades; de otro lado, podemos reutilizar este cdigo, ya que una funcin puede ser llamada cuantas veces la necesitemos. Para definir una funcin debemos usar la palabra reservada function. Para llamar la funcin basta con invocar su nombre.

<?php function Hiperlink () { // // // // } Hiperlink(); ?> // esta linea llama la funcin Entre parentesis () podemos incluir valores que deba usar nuestra funcin. El uso de () es siempre necesario. El cdigo de la funcin entre llaves {}

PHP no distingue entre mayusculas y minusculas al nombrar las funciones, asi que HiperLink sera lo mismo que Hiperlink, aunque es buena prctica ser consistente en la forma de escribir los nombres. Como curiosidad, podrs observar que en los mensajes de error, PHP siempre designa tus funciones en minuscula. Los parentesis permiten pasar valores a las funciones (como veremos despues) y son siempre necesarios, aunque no vayas a pasar valor alguno Un ejemplo simple de una funcin sin parmetros:

<?php function TradicionalHolaMundo (){ echo "hola mundo"; } TradicionalHolaMundo(); // que sorpresa ! imprime "hola mundo" ?> El cdigo que puedes incluir en una funcin es cualquier cdigo php vlido

cuando llamar a una funcin ?

Por lo general puedes usar tu nueva funcin antes o despues de crearla:

<?php TradicionalHolaMundo(); function TradicionalHolaMundo (){ echo "hola mundo"; } ?> El cdigo de la funcin es leido al cargar la pgina el interprete PHP, pero no es ejecutado hasta que la funcin no es llamada. No existe tampoco inconveniente en que mantengas las definiciones de tus funciones en un archivo aparte, llamado en tu script mediante require oinclude. Lo anterior no es vlido, sin embargo, si nuestra funcin est definida de forma condicional:

<?php /************* Primer $buenhumor = true; if ($buenhumor) { function TradicionalHolaMundo () { echo "Hola Mundo !!"; } } TradicionalHolaMundo(); // Podemos llamar a la funcion desde aqui: // La condicion de que depende su creacin // ($buenhumor) est cumplida. /************* segundo ejemplo $buenhumor = false; ****************/ ejemplo ****************/

// Considera este segundo ejemplo: // Ahora la condicion no se cumple.

if ($buenhumor) { // Este cdigo NO se ejecuta !! function TradicionalHolaMundo () { echo "Hola Mundo !!"; } } TradicionalHolaMundo(); // Error ... llamada a funcin no existente. /************* Tercer ejemplo ****************/

TradicionalHolaMundo(); // Tampoco podemos hacer la llamada ANTES // de que la condicin se haya evaluado. Error !! $buenhumor = true; if ($buenhumor) { function TradicionalHolaMundo () { echo "Hola Mundo !!"; } } ?> Adems del error que acabamos de obtener (llamada a una funcin no definida) tambin debemos tener cuidado con el error contrario: definir una funcin dos veces; esto normalmente suele pasar cuando se hace uno un lio con los includes y llama varias veces al archivo externo que contiene la declaracin de la funcin).

funciones y parmetros
Podemos pasar a nuestras funciones valores para que operen sobre ellos. PHP permite pasar a las funciones variables, cadenas de texto, nmeros o arrays Los datos pasados a la funcin pueden ser por valor o por referencia. En el primer caso solo pasamos el valor del dato, no su contenedor, de forma que dicho dato (por ejemplo almacenado en una variable) conserva su valor original fuera de la funcin, sin verse afectado por los cambios que la funcin pueda ejecutar. En cambio si pasamos el valor por referencia, el dato original quedar afectado por el resultado de la funcin:

<?php $msg = "Como ests ?"; function TradicionalHolaMundo ($msg) { $msg= "Hola Mundo !!".$msg; echo $msg; } TradicionalHolaMundo ($msg); echo $msg; $msg = "Como ests ?"; function TradicionalHolaMundo (&$msg) { //advierte que usamos &$ // vuelca "Hola Mundo !! Como estas ? // vuelca "Como ests ?"

$msg= "Hola Mundo !!".$msg; echo $msg; } TradicionalHolaMundo ($msg); echo $msg; ?> // $msg -> Hola Mundo !! Como estas ? // vuelca "Hola Mundo !! Como ests ?"

Puedes tambien prever un valor por defecto para la funcin, que se aplicar salvo que especifiques otro al llamarla:

<?php function TradicionalHolaMundo ($msg = "Hola como ests") { ...} TradicionalHolaMundo(); // Hola Mundo !! Hola como ests ? TradicionalHolaMundo("hasta luego");// Hola Mundo !! hasta luego TradicionalHolaMundo(""); // Hola Mundo !! ?> Cuando la funcin necesite varios valores y desees fijar un valor por defecto, debe ser el ultimo por la derecha de los pasados. Esto implica un cuidadoso diseo, ya que al pasar los valores a una funcin debes hacerlo por el mismo orden fijado al definirla

return
Si la funcin debe retornar algun valor al script, debes indicarlo por medio de la expresinreturn. El cdigo existente en la funcin despues de return no ser ejecutado. En los sencillos ejemplos que hemos usado no empleamos return ya que la unica instruccin de la funcin es precisamente una orden echo. Pero podra suceder que la funcin no tuviera por finalidad volcar nada a pantalla, sino manipular un valor para, por ejemplo, pasarselo a otr funcin. En tal caso usamos return.

<?php function TradicionalHolaMundo ($msg) { return "Hola Mundo !!".$msg; } $blah = TradicionalHolaMundo ($msg); ?>

un ejemplo

Como ya est bien de TradicionalHolaMundo() vamos a ver una funcin sencilla pero algo mas til: la funcin hiperlink() que buscar urls dentro de una cadena de texto, convirtiendolas en enlaces:

<?php $blah = "http://www.ignside.net"; function hiperlink($CadenaTexto) { $CadenaTexto = preg_replace("/(http:\/\/[0-9a-zA-Z\-\._\/]+)/", "<a href=\"\1\">\1</a>", $CadenaTexto); print $CadenaTexto; } hiperlink($blah); ?> La anterior funcin toma un parmetro y busca en l, con preg_replace, la existencia de una url correctamente escrita (http://....) y si la encuentra construye un link que apunta a esa direccion, usando la misma como texto visible del enlace. Podemos perfeccionarla un poco con dos parmetros: // devuelve la url como un enlace clickable // <A href="http://www.ignside.net">http://www.ignside.net</A>

<?php $blah = "http://www.ignside.net"; function hiperlink($CadenaTexto, $textovisible) { $CadenaTexto = preg_replace("/(http:\/\/[0-9a-zA-Z\-\._\/]+)/", "<a href=\"\1\">$textovisible</a>", $CadenaTexto); print $CadenaTexto; } hiperlink($blah, "pulsa aqui"); // devuelve //<A href="http://www.ignside.net">pulsa aqui</A> ?>

Desventajas ?
PHP consume mas recursos (y por tanto es ligeramente mas lento) llamando y ejecutando una funcin que ejecutando cdigo que encuentra en linea, embebido en el script. Por eso no tiene sentido usar funciones salvo que efectivamente vayas a utilizar esa porcin de cdigo varias veces.

De donde vienen las variables ?

Las variables -y sus valores- pueden llegar a nuestro script PHP por distintas vias. El autor del script puede fijar su valor dentro del propio cdigo (variables internas); o puede permitir que sean los usuarios de la pgina quienes proporcionen el valor. Las variables que pueden venir dadas desde fuera del script se llaman variables externas: pueden llegar como cadena de carcteres aadida a una url o un enlace (mtodo get); a traves de un formulario html (mtodo get o post), de cookies, via http (include o upload files) o a traves del servidor web que ejecuta el script (variables de entorno). Si PHP est configurado para registrar las variables externas con alcance global (globals onen la configuracion general PHP), no tenemos forma de distinguirlas de las variables internas, y tanto unas como otras estarn automticamente disponibles para su uso. Y esto puede ser un problema. Un visitante de la pgina podra crear cualquier variable, o pasar cualquier valor, y no solamente a aquellas variables pensadas para tomar su valor del usuario, sino a todaslas variables. Si no filtramos cuidadosamente la entrada de datos, podemos ver comprometida la seguridad de nuestro sistema. Considera este ejemplo, con el que php.net ilustr la necesidad de cambio de configuracin por defecto de PHP:

<?php if (authenticate_user()) { // aqui iria la funcin que comprobaria si el usuario // tiene acceso a la pgina, y tras las comprobaciones // establecidas, declarara "verdadero" el valor de $user_ok $user_ok = true; } // En teoria, si $user_ok = verdadero, el usuario esta validado ?> Nada mas sencillo que llamar a la pgina aadiendo a la url nuestra propia variable:http://www.sitio.com/log.php?user_ok=1 y estariamos validados, aunque la funcin authenticate_user() devolviera un valor de usuario invlido.

La directiva register_globals
En el archivo de configuracin de php (php.ini) podemos ordenar a PHP, mediante la directiva register_globals, que registre (o no) como globales las variables EGPCS, es decir, aquellas variables externas que vienen del entorno -Environment-, o via GET, POST, Cookie y Server.

Tradicionalmente PHP venia preconfigurado con este valor "on", pero se recomienda prescindir de esta posibilidad. La configuracin sugerida por defecto desde la versin 4.2.0 es la deregister_globals off Con globals en off, PHP no crea variables externas globales, lo que supone eliminar la via de ataque mas habitual, al impedir al atacante que inyecte sus propias variables con alcance global. Por supuesto, podemos seguir introduciendo valores en el script de forma externa, pero estos valores no son ya accesibles para el script como lo son las variables internas, sino como valores de array, lo que obliga a chequear mnimamente su origen. Configurar las globales off no supone una solucin total a los problemas de seguridad. Siempre ser necesario chequear y filtrar los datos enviados al script desde fuera, pero supone un gran avance ya que en primer lugar, estamos separando variables internas y externas, y de otro, tenemos clasificadas estas variables externas atendiendo a su origen (get, post, cookie etc). Como contrapartida, encontraremos que la mayora de los scripts de cierta complejidad que hay disponibles, han sido escritos presumiendo una configuracin PHP globals on, con lo cual sencillamente, estos scripts no funcionarn con globals off. Por ello la mayoria de los grandes ISP aun tienen sus configuraciones PHP con registro global de variables. Estamos en un periodo de transicin, siendo de suponer que los programadores, tarde o temprano, iran actualizando sus scripts para dotarlos de mas seguridad, y los servidores solo ofrecern PHP configurado de esta forma. Como ultima nota acerca de la configuracin de globals ten en cuenta que esta directiva no puede cambiarse dinmicamente con la funcin ini_set(), o mas exactamente si se puede, pero no sirve de nada ya que la directiva incluida en php.ini es la que se aplica al tiempo de la ejecucin de tu script. Si podriamos cambiar la configuracin a traves de archivos .htaccess para servidores o carpetas concretas (php_flag register_globals off ), o si usas un servidor apache con host virtuales, y tienes acceso a los archivos de configuracin del server, mediante directivas virtualhost: <VirtualHost 127.0.0.1> ServerName localhost DocumentRoot /var/www/html/misitio php_value register_globals 0 </VirtualHost>.

por que globals off es mas seguro ?

PHP es un lenguaje de programacin muy flexible, particularmente en el manejo de variables. En PHP no necesitas declarar o iniciar una variable antes de usarla, ni declarar el tipo de valor que puede contener (string, decimal, entero) ya que cualquier variable puede tener en principio cualquier tipo de valor. Sin embargo, esta comodidad tambien implica un problema de seguridad, ya que cualquiera puede introducir en la ejecucin de tu script nuevas variables y valores con alcance global. Por naturaleza, el cdigo es mas seguro cuando el programador se asegura de que el valor de una variable viene de donde tiene que venir y pertenece al tipo que se le supone. Con globals on hay que poner un cuidado especial en la validacin de los datos introducidos por los usuarios y en las variables no inicializadas por el propio script antes de su uso. Por contra, si tenemos desactivada esta opcin, la variable no se crea directamente, y solo podemos acceder a su valor via superglobales, con lo que implcitamente estamos asegurandonos de que el valor de esa variable viene proporcionado por el mtodo (get, post) previsto. Las variables internas quedan asimismo aisladas, ya que por ejemplo, si usamos una variable$user_ok como clave para el proceso de autentificacin del usuario, nadie podr falsificarla mediante la adicin de una cadena a una url (http://www.sitio.net/login.php?user_ok=1), como podra hacer por el contrario con globals on En cuanto a las variables que deben tomar su valor de una fuente externa al script, por ejemplo, la tipica variable $mail donde se almacena el email que nos proporciona el usuario, debemos acceder a ese valor mediante el empleo de $_GET['mail'] o $_POST['mail'], segun el sistema previsto de envio. Las ventajas son en primer lugar que $mail no puede ser directamente modificada. Y con $_GET y $_POST podemos saber, al menos, si el dato nos es remitido por el mtodo get o post seleccionado por nosotros.

Superglobales
Los valores externos estn ahora a nuestra disposicin a travs de los arrays predefinidos$_SERVER, $_ENV, $_SESSION, $_COOKIE, $_GET y $_POST
1. 2. 3. 4. 5. 6. 7. 8. 9. $_GET['variable'] - Variables proporcionadas via HTTP GET. $_POST['variable'] - Variables proporcionadas via HTTP POST. $_COOKIE['variable'] - Variables proporcionadas via HTTP cookies. $_REQUEST['variable'] - Variables proporcionadas via GET, POST, o COOKIE. $_GLOBALS['variable'] - Array con todas las variables de alcance global. $_SERVER['variable'] - Variables via servidor o relacionadas con el entorno de ejecucin. $_FILES['variable'] - Variables via upload archivos $_ENV['variable'] - Variables del entorno $_SESSION['variable'] - Variables registradas en una sesin

Coexistiendo con globals on

A veces la configuracin ptima de PHP no ser opcin para nosotros, bien porque nuestra pgina est en un servidor comercial, bien porque necesitamos usar un script que precisaglobals on para funcionar. He aqui unas pocas pistas que ayudarn a mejorar la seguridad: y
Inicializa, al comienzo de cada script, cada una de las variables internas, especialmente aquellas que uses como control de clausulas condicionales. Asi se evita que puedan ser suplantadas por variables introducidas por el usuario, ya que el script al ejecutarse reinicializar su valor. Configura el nivel de mensajes de error al mximo, mientras realizas cambios en el script, ya que asi recibirs informacin complementaria del sistema (por ejemplo, advertencias de variables no inicializadas). Suprime los mensajes de error cuando subas el script a tu pgina, ya que pueden ofrecer informacin interna valiosa para un posible atacante. Filtra siempre los datos remitidos por los usuarios. Es efectivo chequear tambin la lngitud de los datos remitidos. No olvides que las cookies puedes ser fcilmente manipuladas, o que cualquier persona puede crear un formulario html y apuntarlo a tu pgina, pasando los valores via post. Las funciones que permiten subir archivos a tu pgina son especialmente sensibles. Procura usar siempre una version PHP actualizada ... o utilizar un ISP que sea diligente al actualizar sus servidores. Si usas scripts hechos por terceros, estate al tanto de las actualizaciones.

y y y y y y

Coexistiendo con globals off


Bsicamente debes recordar que las variables que pasas de una pgina a otra via formulario, o las que recibes via url, deben ser leidas por el script no directamente, sino de la supervariable correspondiente

<?php // // si tenemos que procesar una url con variables, similar a http://www.mipagina.com/index.php?op=login

print $op; // mostrara error: variable $op no definida print $_GET["op"]; // mostrara 'login' ?> Otras variables a las que estamos acostumbrados dejan tambien de estar disponibles de forma directa. Asi, en lugar de $PHP_SELF tendras que usar $_SERVER['PHP_SELF'];

Vous aimerez peut-être aussi