Professional Documents
Culture Documents
Indice
6.1 MySQL.........................................................................18
6.2 ODBC............................................................................22
6.3 Más bases de datos soportadas. .................................24
11. Seguridad....................................................................................................34
12.1 PDF..............................................................................38
12.2 Funciones de impresión. ...........................................39
12.3 XML con PHP............................................................40
Debemos destacar que PHP al igual que lenguajes como ASP o JSP, se ejecuta en el
servidor, de manera que el cliente sólo recibe el resultado de la ejecución en el servidor.
De esta forma el cliente no puede conocer el código que ha generado esa salida. Este
funcionamiento es muy diferente a lenguajes como Javascript, que se ejecutan en el
cliente, pudiendo ver el usuario todo el código y su funcionamiento.
PHP puede hacer cualquier cosa que se pueda hacer con un script CGI, como procesar la
información de formularios, generar páginas con contenidos dinámicos, o mandar y
recibir cookies.
El cliente no puede ver el código PHP, por esto PHP es transparente para el usuario,
únicamente verá el resultado en HTML que genera el interprete de PHP; de esta forma
cualquier navegador puede interpretar el resultado obtenido en HTML.
Veamos algunas más de las múltiples ventajas que PHP ofrece. Entre estas podemos
destacar:
- Es multiplataforma, funciona tanto para Unix (con Apache) como para Windows
(con Microsoft Internet Information Server) de forma que el código ya creado
para una de ellas no tiene porqué modificarse al pasar a la otra.
- Para quien conozca las ASP (Active Server Pages) de Microsoft, PHP es muy
parecido, sólo que más rápido, gratuito y multiplataforma.
Veamos una breve introducción al lenguaje HTML para poder entender mejor las
ventajas que nos ofrece PHP.
Es esta deficiencia del HTML la que ha hecho necesario el empleo de otros lenguajes
más potentes y mucho más versátiles y de un aprendizaje relativamente más
complicado, capaces de responder de manera inteligente a las demandas del navegador
y que permiten la automatización de determinadas tareas tediosas e irremediables como
pueden ser las actualizaciones, el tratamiento de pedidos de una tienda virtual, una
sencilla operación matemática...
Veamos un ejemplo de la utilidad de PHP: Supongamos que tenemos una pagina web
para una tienda de libros, y que queremos que se actualicen las nuevas adquisiciones,
ofertas y novedades de cada semana. Toda la información de los libros estará
almacenada en una Base de Datos, y es sencillo con PHP que toda esa información se
actualice automáticamente accediendo a la Base de Datos, si la pagina fuera
simplemente en HTML, tendríamos que modificar manualmente todas las paginas
actualizando toda la información.
En las secciones siguientes, veremos en más profundidad una parte de todas las ventajas
que nos ofrece este lenguaje.
PHP es un lenguaje creado por una gran comunidad de personas. El sistema fue
desarrollado originalmente en el año 1994 por Rasmus Lerdorf como un CGI escrito en
C que permitía la interpretación de un número limitado de comandos. El sistema fue
denominado Personal Home Page Tools y adquirió relativo éxito gracias a que otras
personas pidieron a Rasmus que les permitiese utilizar sus programas en sus propias
páginas. Dada la aceptación del primer PHP y de manera adicional, su creador diseñó un
sistema para procesar formularios al que le atribuyó el nombre de FI (Form Interpreter)
y el conjunto de estas dos herramientas, sería la primera versión compacta del lenguaje:
PHP/FI.
En los dos últimos años, el número de servidores que utilizan PHP se ha disparado,
logrando situarse cerca de los 5 millones de sitios y 800.000 direcciones IP a finales del
2000, cifra que actualmente habrá sido superada ampliamente, lo que le ha convertido a
PHP en una tecnología popular. Esto es debido, entre otras razones, a que PHP es el
complemento ideal para que el tándem Linux-Apache sea compatible con la
programación del lado del servidor de sitios web. Gracias a la aceptación que ha
logrado, y los grandes esfuerzos realizados por una creciente comunidad de
colaboradores para implementarlo de la manera más óptima, podemos asegurar que el
lenguaje se convertirá en un estándar que compartirá los éxitos augurados al conjunto de
sistemas desarrollados en código abierto.
En esta sección conoceremos los tipos de datos, variables, operadores y estructuras más
utilizadas en PHP, veremos el uso de la sintaxis con ejemplos prácticos.
Existe la posibilidad de usar cuatro pares de etiquetas pero de éstas, sólo dos están
disponibles siempre:
Las otras dos formas de identificar el código PHP tienen el problema de que no vienen
por defecto y para usarlas hay que modificar unos parámetros en el archivo de
configuración de php (php.ini).
<? <%
// Código PHP // Código PHP
?> %>
Forma abreviada de <?php Etiquetas usadas para ASP
4.3 Variables
En PHP todas las variables comienzan con el símbolo del dólar “$” y no es necesario
definir una variable antes de usarla. Tampoco tienen tipos, es decir que una misma
variable puede contener un número y luego puede contener caracteres. Debemos de
tener en cuenta, que el nombre de las variables es sensibles a minúsculas y mayúsculas.
Ejemplo 1
<html>
<head>
<title>Ejemplo de PHP</title>
</head>
<body>
<?php
$a = 1; // almacenamos en $a un entero
$b = 3.34; // almacenamos en $b un float
$c = "Hola Mundo"; // almacenamos en $c una cadena
echo $a,"<br>",$b,"<br>",$c; // mostramos en pantalla el contenido de las variables
?>
</body>
</html>
En PHP las variables se asignan por valor, esto quiere decir que, por ejemplo, después
de asignar el valor de una variable a otra, los cambios que se efectúen a una de esas
variables no afectará a la otra.
PHP4 ofrece otra forma de asignar valores a las variables: asignar por referencia. Esto
significa que la nueva variable simplemente referencia (en otras palabras, "se convierte
en un alias de" o "apunta a") la variable original. La asignación por referencia se realiza
más rápidamente al no tener que copiar el contenido de la variable. Dicha asignación se
realiza poniendo un & delante de la variable.
Ejemplo 2
<?php
$foo = 'Bob'; // Asigna el valor 'Bob' a $foo
$bar = &$foo; // Referencia $foo vía $bar.
$bar = "Mi nombre es $bar"; // Modifica $bar...
echo $foo; // $foo también se modifica.
echo $bar;
?>
Hemos de tener en cuenta que solo las variables con nombre pueden asignarse por
referencia, es decir no podemos asignar por referencia $(2+4).
PHP proporciona una gran cantidad de variables predefinidas a las que se puede acceder
a través de cualquier script. En nuevas versiones de PHP, es necesario modificar el
archivo de configuración "php.ini" para tener acceso a estas variables.
§ argc
Contiene la cadena de petición en una línea de comandos.
§ argv
Contiene el número de argumentos de la línea de comandos, que son variables
muy utilizadas en C.
§ HTTP_GET_VARS
Es un array asociativo con las variables pasadas mediante el método GET, bien a
través de un formulario o bien pasado directamente por la url.
§ HTTP_POST_VARS
Es un array asociativo con las variables pasadas mediante el método POST a
través de un formulario.
§ HTTP_COOKIE_VARS
Es un array asociativo formado por las variables pasadas mediante cookies.
Dada su naturaleza de lenguaje de lado servidor, PHP es capaz de darnos acceso a toda
una serie de variables que nos informan sobre nuestro servidor y sobre el cliente. La
información de estas variables es atribuida por el servidor y en ningún caso nos es
posible modificar sus valores directamente mediante el script.
Existen multitud de variables de este tipo, algunas sin utilidad aparente y otras
realmente interesantes y con una aplicación directa para nuestro sitio web.
Variable Descripción
Nos informa principalmente sobre el sistema operativo y tipo y versión
de navegador utilizado por el internauta. Su principal utilidad radica en
que, a partir de esta información, podemos redireccionar nuestros
$HTTP_USER_AGENT
usuarios hacia páginas optimizadas para su navegador o realizar
cualquier otro tipo de acción en el contexto de un navegador
determinado.
Nos devuelve la o las abreviaciones de la lengua considerada como
principal por el navegador. Esta lengua o lenguas principales pueden
$HTTP_ACCEPT_LANGUAGE ser elegidas en el menú de opciones del navegador. Esta variable
resulta también extremadamente útil para enviar al internauta a las
páginas escritas en su lengua, si es que existen.
Nos indica la URL desde la cual el internauta ha tenido acceso a la
$HTTP_REFERER página. Muy interesante para generar botones de "Atrás" dinámicos o
para crear nuestros propios sistemas de estadísticas de visitas.
Nos devuelve una cadena con la URL del script que está siendo
$PHP_SELF
ejecutado. Muy interesante para crear botones para recargar la página.
Se trata de un array que almacena los nombres y contenidos de las
$HTTP_GET_VARS
variables enviadas al script por URL o por formularios GET
Se trata de un array que almacena los nombres y contenidos de las
$HTTP_POST_VARS
variables enviadas al script por medio de un formulario POST
Se trata de un array que almacena los nombres y contenidos de las
$HTTP_COOKIES_VARS
cookies. Veremos qué son más adelante.
Almacena la variable usuario cuando se efectúa la entrada a páginas de
$PHP_AUTH_USER acceso restringido. Combinado con $PHP_AUTH_PW resulta ideal
para controlar el acceso a las páginas internas del sitio.
Almacena la variable password cuando se efectúa la entrada a páginas
$PHP_AUTH_PW de acceso restringido. Combinado con $PHP_AUTH_USER resulta
ideal para controlar el acceso a las páginas internas del sitio.
$REMOTE_ADDR Muestra la dirección IP del visitante.
Nos devuelve el path físico en el que se encuentra alojada la página en
$DOCUMENT_ROOT
el servidor.
Guarda el identificador de sesión del usuario. Veremos más adelante
$PHPSESSID
en qué consisten las sesiones.
4.4 Operadores
Las variables, pueden ser creadas, modificadas y comparadas con otras por medio de los
llamados operadores. En apartados anteriores de este trabajo hemos utilizado en
nuestros ejemplos algunos de ellos.
Operadores aritméticos
Nos permiten realizar operaciones numéricas entre variables y números.
Signo Operación
+ Suma
- Resta
* Multiplicación
/ División
% Devuelve el resto de la división
Operadores de comparación
Se utilizan principalmente en las sentencias condicionales (if) para comparar dos
variables y verificar si cumple o no la propiedad del operador.
Signo Operador de
== Igualdad
!= Desigualdad
< Menor que
<= Menor igual que
> Mayor que
>= Mayor igual que
Operadores lógicos
Se usan en combinación con los operadores de comparación cuando la expresión de la
condición lo requiere.
And Y
Or O
! No
- 10 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Operadores de incremento
Sirven para aumentar o disminuir en una unidad el valor de una variable. Podemos
distinguir dos tipos: Operadores de preincremento y de postincremento.
El primer tipo primero incrementa el valor y luego devuelve $a mientras que el segundo
tipo primero devuelve el valor actual y después incrementa la variable en uno.
Operadores combinados
Una forma habitual de modificar el valor de las variables es mediante los operadores
combinados:
Este tipo de expresiones no son más que abreviaciones de otras formas más clásicas
- 11 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Todo archivo de comandos PHP se compone de una serie de sentencias. Una sentencia
puede ser una asignación, una llamada a función, un bucle, una instrucción condicional
e incluso una sentencia que no haga nada. Las sentencias normalmente acaban con
punto y coma. También se pueden agrupar las sentencias, encapsulándolas mediante
llaves. En esta apartado estudiaremos en profundidad unos de estos tipos de sentencias
denominadas estructuras de control (bucles, sentencias condicionales...).
Omitiremos por simplicidad, las etiquetas de apertura y cierra que indican, comienzo y
fin del lenguaje PHP.
Ejemplo 1
a es mayor que b
Si queremos que dentro de la instrucción if haya varias sentencias las podemos agrupar
utilizando llaves {...}
Ejemplo 2
- 12 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Ejemplo 3
en cualquier otra caso (en que caso de que a sea menor o igual que b), mostrará
“a NO es mayor que b”
Con la sentencia switch, podemos ejecutar unas u otras instrucciones dependiendo del
valor de la variable que estemos utilizando. Veamos un ejemplo para comprenderlo
mejor.
- 13 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Ejemplo 4
$i=0;
while ($i<10)
{
echo "El valor de i es ", $i,"<br>";
$i++;
}
- 14 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
La instrucción for es la instrucción de bucles más completa. En una sola instrucción nos
permite controlar todo el funcionamiento del bucle.
El primer parámetro del for, es ejecutado la primera vez y sirve para inicializar la
variable del bucle, el segundo parámetro indica la condición que se debe cumplir para
que el bucle siga ejecutándose y el tercer parámetro es una instrucción que se ejecuta al
final de cada iteración y sirve para modificar el valor de la variable de iteración.
Ejemplo 5
- 15 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Cuando se llega a un cierto punto nos preguntamos... ¿cómo puedo mostrar lo que yo
quiero por pantalla? ¿cómo muestro el contenido de una variable?.
Pues bien, para realizar esto, disponemos de la sentencia echo " " y de un par de
funciones más.
La sentencia echo nos permite dar salida a una o más cadenas. No hace falta especificar
el tipo de variable a la cual se da salida.
Se puede usar de la siguientes formas entre otras:
La función print funciona igual que echo ya que da salida a una o varias cadenas sin
formato.
Por último tenemos la función printf, la cual nos permite especificar el tipo de variable
que vamos a mostrar.
La cadena con el formato indica cómo se han de representar los valores que vienen
especificados detrás de la cadena con el formato, todos ellos seguidos por comas si hay
mas de uno.
% s Cadena de caracteres
% d Número sin decimales
% f Número con decimales
% c Caracteres ASCII
Ejemplo 5
<?php
printf("El numero 2 en formato entero: %d",2);
printf("El numero 2 en formato real: %f",2);
printf("El numero 2 en formato real con 3 decimales: %.3f",2);
?>
- 16 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
PHP además soporta la herencia simple. Esto quiere decir que una clase puede heredar
de otra adquiriendo todos sus métodos y atributos. Hay que tener en cuenta que PHP
sólo soporta la herencia simple y no la herencia múltiple por lo que una clase no podrá
derivar de más de una clase padre. Otro inconveniente es que no es posible sobrecargar
métodos en PHP. La sobrecarga de métodos consiste en tener más de un método de una
clase con el mismo nombre pero con distintos parámetros de forma que según como se
realice la llamada se ejecutará una u otra función.
Bueno, entremos un poco más en detalle sobre cómo definir una clase en PHP:
Ejemplo 1
class Nombre_Clase {
/* Métodos de la clase */
function Sumar () {
$suma=$this->var1 + $this->var2;
}
Una vez definida la clase, para crear un nuevo objeto de esta clase necesitaríamos usar el
operador new:
Si ahora hiciéramos un echo $suma; debería mostrarnos por pantalla el número 25. Es decir,
el valor 20 de $var2 definido al crear la clase, sumado a 5 que es el valor que le hemos
pasado al crear el objeto.
- 17 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Una de las principales ventajas que presenta el trabajar con páginas dinámicas, es el
poder almacenar los contenidos en bases de datos. De esta forma, podemos
organizarlos, actualizarlos y buscarlos de una manera mucho más simple.
Esta interacción se realiza, por un lado, a partir de las funciones que PHP nos propone
para cada tipo de base de datos y, por otro estableciendo un diálogo a partir de un
idioma universal: SQL (Structured Query Language) el cual es común a todas las bases
de datos. Este lenguaje resulta muy potente y fácil de aprender.
A continuación mostraremos las bases de datos más importantes soportadas por PHP,
por una parte MySQL, por ser la más usada con PHP y por otra parte aquellas que
funcionan bajo conexión ODBC.
6.1 MySQL
Vamos a estudiar el acceso a bases de datos MySQL por ser gratuita, eficiente y por ser
también la más extendida en combinación con PHP.
El servidor donde tenemos alojadas las páginas nos tiene que proporcionar herramientas
para crearla o acceso al Telnet para que la creemos por nosotros mismos.
En este manual supondremos que tenemos la BD ya creada y ubicada en un hipotético
servidor.
Para poder empezar a trabajar con bases de datos MySQL, antes que nada necesitamos
saber cómo realizar una conexión al servidor MySQL y cómo seleccionar la base de
datos que vamos a usar.
$link=mysql_connect("nombre de host","usuario","password");
Finalmente, una vez que hemos terminado de usar el vínculo con la base de datos, lo
liberaremos con la instrucción mysql_close para que la conexión no quede ocupada.
Una vez hecha la conexión el servidor debemos seleccionar la base de datos con la que
vamos a trabajar. Esto se hace con la instrucción:
- 18 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Con el “nombre de la Base de Datos” a la que queremos acceder y con la variable $link
que es el resultado de haber hecho la conexión con el servidor, seleccionamos la BD con
la que deseamos trabajar.
Ahora estudiaremos como realizar las operaciones más básicas sobre nuestra BD,
(inserción, búsqueda, modificación y eliminación).
De esta forma tan sencilla insertaremos a una persona de nombre Marta, apellidos
García, sexo Mujer y edad 24 años.
- 19 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Veamos con un ejemplo práctico la sintaxis de como realizar una consulta sobre la BD.
En la variable $result se almacenaran todos los registros de personas con edad igual a 22
años. Con el * detrás del select estamos indicando que todos los campos de cada
registro serán recuperados.
Para extraer todos los datos obtenidos en la consulta, necesitamos usar un bucle que
ejecute esta función. En cada llamada, se irá devolviendo un registro de la consulta,
desde el primero hasta el último. En el momento en que no queden más registros que
mostrar, la función devolverá False y el bucle dejará de ejecutarse.
- 20 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Con esta instrucción modificamos el campo edad de todas las personas con nombre
"Juan" que estén en la tabla personas, actualizando su valor a 23.
Como solo hay una persona con ese nombre, únicamente se actualizará un registro de
nuestra BD. En el caso de que ningún registro cumpla la condición, la tabla no será
modificada.
La tabla con la que representamos nuestra Base de Datos quedaría de la siguiente forma:
§ ELIMINACIÓN DE REGISTROS
Esta instrucción elimina a todas las personas que cumplan la condición Sexo='Hombre'.
Como podemos ver, tenemos dos personas en la tabla que cumplen esta condición, así
que al llamar a esta sentencia serán eliminados de la Base de Datos.
- 21 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
6.2 ODBC
En este apartado conoceremos como PHP nos permite trabajar con ODBC. Como
vamos a ver ahora, todas las funciones usadas comienzan con la palabra odbc, siendo la
metodología de trabajo muy similar a la que utilizábamos con MySQL
El primer paso a realizar es conectar con la base de datos. Para ello necesitamos el
nombre de la conexión DSN que debería haberse creado previamente usando la
configuración del puente ODBC. Además también necesitaremos el nombre de usuario
y el password especificados al crear esa conexión.
odbc_exec($link,"SQL a ejecutar");
Mostraremos un ejemplo, partiendo una situación inicial en la que contamos con una
base de datos de personas con los siguiente campos:
Podemos realizar cualquier consulta que deseemos sobre la BD, en este ejemplo vamos
a obtener todos las personas de la base de datos que viven en Almería.
- 22 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
En $result se guardarán todos los resultados obtenidos, es decir, todos los registros que
cumplan la condición.
Veamos ahora como obtener los valores de esos registros del resultado.
while(odbc_fetch_row($result))
{
$nombre = odbc_result( $result, "nombre");
$edad = odbc_result( $result, "edad");
$ciudad = odbc_result( $result, "ciudad");
$profesión = odbc_result( $result, "profesión");
}
Si queremos obtener los datos del registro al que apunta $result, debemos usar la
función odbc_result,
A esta función le pasamos la variable $result obtenida al realizar la consulta, junto con
el nombre del campo del registro que queremos extraer. Esta función devolverá el valor
que contiene el campo. En el ejemplo que estamos considerando el campo nombre
contendrá la cadena de texto “Susana”.
Por ello, debemos ejecutar esta función tantas veces como campos queramos extraer.
odbc_close() nos permite cerrar la conexión con el servidor de bases de datos asociado
al identificador que le pasemos como parámetro.
Existen multitud de funciones usadas para trabajar con ODBC aunque sólo hemos
mostrado las más importantes y necesarias para realizar las operaciones básicas.
- 23 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Quizás la característica más potente y destacable de PHP es su soporte para una gran
cantidad de bases de datos.
Ofrece interfaces para el acceso a la mayoría de las bases de datos comerciales y por
ODBC a todas las bases de datos posibles en sistemas Microsoft, a partir de las cuales
podremos editar el contenido de nuestro sitio con absoluta sencillez.
También tenemos una extensión DBX de abstracción de base de datos que permite usar
de forma transparente cualquier base de datos soportada por la extensión.
Adicionalmente, PHP soporta por defecto ODBC (The Open Database Connection
standard), así que es posible conectar a cualquier base de datos que soporte este
estándar.
- 24 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Cuando navegamos por internet visitamos multitud de distintas paginas, muchas de ellas
bastante complicadas que implementan distintos servicios de Internet. Estas páginas
tienen que guardar distintas informaciones acerca de un usuario, por ejemplo su nombre,
su edad o su color preferido. Para ello cuentan con una serie de mecanismos en el
servidor como bases de datos u otro tipo de contenedores, pero hay un mecanismo
mucho más interesante de guardar esa información que los propios recursos del
servidor, que es el propio ordenador del usuario.
La utilidad principal de las cookies es la de poder identificar al navegador una vez éste
visita el sitio por segunda vez y así, en función del perfil del cliente dado en su primera
visita, el sitio puede adaptarse dinámicamente a sus preferencias (lengua utilizada,
colores de pantalla, formularios rellenados total o parcialmente, redirección a
determinadas páginas...).
Dicho de otra forma las cookies son cadenas de texto que son enviadas desde el
servidor al cliente (navegador) y almacenadas en este, luego el navegador envía estas
cookies al servidor permitiendo así la identificación del cliente en el servidor.
Las cookies han levantado una polémica sobre el derecho a la intimidad de cada usuario
y sobre la inseguridad de que los servidores metan archivos de texto en nuestros
ordenadores.
Debemos comentar, que es un poco peligroso que las páginas web a las que accedemos
se dediquen a introducir cosas en nuestro ordenador, debido a esto, las cookies están
altamente restringidas. Para empezar, solamente podemos guardar en ellas textos, nunca
programas, imágenes, etc. Además, los textos nunca podrán ocupar más de 1 K, de
modo que nadie podría inundarnos el ordenador a base de cookies. Estas restricciones,
unidas a la necesidad de poner una fecha de caducidad a las cookies para que estas se
guarden, hacen que el aceptar cookies no signifique un verdadero problema para la
integridad de nuestros sistemas.
El navegador se puede configurar para que no acepte ninguna cookie, o para que nos
avise cada vez que un servidor intente introducir una cookie en nuestro PC.
- 25 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
El navegador las envía, permitiendo la identificación del usuario por parte del servidor.
A continuación vamos a ver como usar las cookies para nuestro beneficio .
El manejo de cookies en PHP se realiza de una manera muy sencilla, mediante el uso de
la función setcookie, esta función esta disponible a partir de la versión 3 de PHP.
int setcookie (string Nombre [, string Valor [, int Expire [, string Path [, string Dominio
[, int Secure]]]]]);
Setcookie() define una cookie que es enviada junto con el resto de la información de la
cabecera(header). Las cookies deben ser enviadas antes de cualquier tag de html, por lo
tanto deberemos realizar la llamada a estas funciones antes de cualquier tag <HTML> o
<HEAD>. Esta es una restricción de las cookies no de PHP.
- 26 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
En este ejemplo establecemos una cookie de nombre usuario que contiene el valor
Antonio, que dura 1 hora (3600 segundos) válida para todo el dominio JuanYZubi.com
Para utilizar el valor de la cookie en nuestros scripts tan sólo tendremos que llamar la
variable que define la cookie.
Se ha establecido la cookie de nombre “usuario”, su valor es: <? print $usuario; ?>
Por otra parte, es interesante señalar que el hecho de que definir una cookie ya existente,
implica el borrado de la antigua. Del mismo modo, el crear una primera cookie conlleva
la generación automática del archivo texto.
- 27 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Bucles y condiciones son muy útiles para procesar los datos dentro de un mismo script.
Sin embargo, en un sitio Internet, las páginas vistas y los scripts utilizados son
numerosos. Muy a menudo necesitamos que nuestros distintos scripts estén conectados
unos con otros y que se sirvan de variables comunes. Por otro lado, el usuario
interacciona por medio de formularios cuyos campos han de ser procesados para poder
dar una respuesta. Todo este tipo de factores dinámicos han de ser eficazmente
regulados por un lenguaje como PHP.
Las variables de un script tienen una validez exclusiva para el script y que nos resulta
imposible conservar su valor cuando ejecutamos otro archivo distinto aunque ambos
estén enlazados. Existen varias formas de enviar las variables de una página a otra de
manera a que la página destino reconozca el valor asignado por el script de origen:
Para pasar las variables de una página a otra lo podemos hacer introduciendo dicha
variable dentro del enlace hipertexto de la página destino.
Podéis observar que estas variables no poseen el símbolo $ delante. Esto es debido a
que en realidad este modo de pasar variables no es específico de PHP sino que forma
parte del protocolo http.
Ahora nuestra variable pertenece también al entorno de la página destino.php y está lista
para su utilización.
- 28 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
9.- Sesiones
Al no usar sesiones, las variables creadas sólo existen en el archivo que es ejecutado de
forma que si cargamos una página distinta estas variables se pierden a no ser que
pasemos las variables a través de la URL o mediante un formulario. Estos métodos,
aunque útiles, no son todo lo prácticos que podrían en determinados casos en los que la
variable que queremos conservar ha de ser utilizada en varios scripts diferentes.
Nos resulta pues necesario el poder declarar ciertas variables que puedan ser reutilizadas
tantas veces como queramos dentro de una misma sesión.
Veamos unos supuestos prácticos que nos desvelen la utilidad del uso de sesiones.
PHP nos permite almacenar variables llamadas de sesión que, una vez definidas, podrán
ser utilizadas durante este tiempo por cualquiera de los scripts de nuestro sitio. Estas
variables serán específicas del usuario de modo que varias variables sesión del mismo
tipo con distintos valores pueden estar coexistiendo para cada una de las sesiones que
están teniendo lugar simultáneamente. Estas sesiones tienen además su propio
identificador de sesión que será único y específico.
- 29 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Las sesiones han de ser iniciadas al principio de nuestro script. Antes de abrir cualquier
etiqueta o de imprimir cualquier cosa. En caso contrario se producirá un error.
Ejemplo 1
<?
session_register('contador');
?>
<HTML>
<HEAD>
<TITLE>contador.php</TITLE>
</HEAD>
<BODY>
<?
if (!isset($contador))
$contador=0;
++$contador;
echo "<a href='contador.php'>Has recargado esta página $contador veces</a>";
?>
</BODY>
</HTML>
Función Descripción
Session_id() Nos devuelve el identificador de la sesión
Session_destroy() Cierra la sesión eliminando todas las variables y el identificador.
Session_unregister('variable') Elimina una variable de sesión
- 30 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
10.- Librería GD
Una de las peculiaridades que PHP nos presenta con respecto a otros lenguajes
dinámicos es la utilización de la llamada biblioteca GD. Esta biblioteca no es más que
un conjunto de funciones que tienen como objeto la creación de imágenes.
Crear gráficos por programación implica usar variables para definir colores o
tipos y tamaños de letra. Esto quiere decir que, llegado el momento, podemos
cambiar el aspecto de multitud de imágenes creadas con un mismo script tan
sólo modificando unos pocos parámetros de éste. Esto nos ahorraría muchas
horas de trabajo el día en el que decidamos dar un cambio de diseño a la página
por ejemplo. Por otra parte, ponemos a disposición del usuario un elemento
adicional de interacción dado que esta parametrización puede ser llevada a cabo
por él mismo y guardada como cookies en su disco duro.
- 31 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
• El ahorro en memoria
Si bien es posible crear archivos con estas herramientas, también es posible crear
las imágenes de una forma temporal lo cual nos permite economizar memoria.
Este elemento puede ser interesante en casos en los que tenemos un espacio de
alojamiento limitado o bien si las imágenes que mostramos en el sitio son
numerosas y se muestran pocas veces. Sin embargo, también tiene el efecto de
resultar más lento puesto que la imagen ha de ser creada antes de ser mostrada lo
cual requiere un tiempo de procesamiento suplementario.
Llevados a cabo estos pasos, PHP está en situación de reconocer cualquier llamada a
una función de la biblioteca GD. Esta biblioteca freeware de la compañía americana
Boutell presenta en sus versiones más actuales una importante variante con respecto a
sus predecesoras: no tiene en cuenta el formato GIF. Esto es debido a que el formato
GIF ha dejado de ser gratuito y para su uso en cualquier aplicación es necesario pagar
una licencia. Es por ello que la biblioteca GD incluye el formato PNG como alternativa.
Este formato nos permite las mismas posibilidades aunque presenta el problema de que
no es reconocido por la totalidad de los navegadores. Este inconveniente es actualmente
solventado por la mayoría de los programadores utilizando versiones antiguas de la
biblioteca que siguen circulando por la red.
- 32 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Existen otras funciones, también de esta librería, que no sirven para crear nuevas
imágenes pero si para extraer información de imágenes ya existentes. Podemos obtener
el formato que tiene una imagen (GIF,JPG,PNG), su altura, anchura ...
Funciones informativas
- 33 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Como ya hemos visto a lo largo de este trabajo, PHP es un lenguaje muy rico, posee una
gran cantidad de funcionalidades e intenta ofrecerlas de una forma sencilla para el
programador.
Como es lógico pensar, desde el punto de vista de la seguridad, cuanto más rico sea el
lenguaje en funcionalidad, más aumenta el riesgo de que en un “usuario malicioso”
puede atacar nuestro sitio web.
En esta sección hablaremos de algunos temas de seguridad relativos a PHP, explicando
algunas de sus vulnerabilidades y exponiendo la forma de proteger nuestros scripts,
veremos solo unos cuantos ejemplos, ya que el tema de seguridad es un campo muy
amplio y cada día surgen nuevos “agujeros de seguridad”.
En PHP no hace falta declarar variables para usarlas, esto es una ventaja para el
programador, dichas variables son validas para todo el script, estas variables se pueden
pasar de una pagina a otra, esto que en principio parece ser una ventaja, si no es usado
convenientemente se puede convertir en un grave problema de seguridad, veamos un
caso práctico.
página principal.php
<?php
if ($password == "mi_contraseña")
$autentificado = 1;
if ($autentificado == 1)
echo "Tu número de tarjeta de crédito es XXX";
?>
página validar.php
En la ejecución normal, se espera que la variable autentificado este vacía y solo tome el
valor 1 si el password procedente de la pagina principal.php coincide con la contraseña.
El problema está en confiar en que las variables van a estar inicializadas a vacío. Un
usuario remoto puede hacer uso de las variables pasando a través de la URL la variable
deseada por POST: 'http://server/validar.php?autentificado=1'. El código de validar.php
no reconocerá la contraseña como válida, pero la variable autentificado habrá sido
- 34 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
Para proteger un script de este tipo debemos asegurar que la variable que usamos no se
encuentra en ninguno de los arrays $HTTP_GET/POST_VARS o bien en los arrays
$_GET o $_POST si la versión de PHP es la 4.1 o superior.
Además no debemos presuponer que la variable no va a contener nada de principio.
Debido a esto, una solución sería asegurarnos que al realizar la comparación de la
variable (autentificado), ésta va a contener exactamente el valor que nosotros queremos
que tenga:
if ($password == "mi_contraseña")
$autentificado = 1;
else
$autentificado = 0;
Si la variable $autentificado fue pasada a este script a través de GET o POST, su valor
será sobrescrito automáticamente al ejecutar este código.
También podemos encontrar problemas de seguridad en otro tipo de script como son los
que realizan upload de archivos, es decir, subir archivos al servidor vía web a través de
un formulario.
Este formulario permite al usuario seleccionar un archivo del disco local de forma que
al pulsar sobre el botón de enviar el fichero será transferido a un directorio del servidor
remoto.
Esta función es de mucha utilidad pero la respuesta que ofrece PHP es muy peligrosa.
Cuando PHP recibe la petición, antes de empezar a ejecutar el script, recibe el archivo
del usuario remoto, chequea que el archivo no sea superior a la variable
$MAX_FILE_SIZE (10kb en este caso) y el máximo permitido desde el archivo de la
configuración de PHP, si pasa estos chequeos el archivo es grabado en el disco remoto
en un directorio temporal. Un usuario remoto puede enviar los archivos que el quiera y
antes de que el script decida si lo deja o no, el archivo se graba al disco.
Como ya hemos dicho el archivo es recibido y grabado al disco local (en la ubicación
que se especifica en la configuración, casi siempre es /tmp) con un nombre aleatorio
(ej. "GB0001"). El script PHP necesita información con respecto al archivo que subimos
para procesarlo.
PHP da valor a 4 variables locales para describir a un archivo de upload, por ejemplo
(nombres del form anterior):
- 35 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
El script trabaja con el archivo mediante la variable $hello. El problema radica en que es
posible que $hello no sea una variable a la que PHP le haya dado valor y que el atacante
simplemente le haya asignado los valores que el desea.
http://server/pagina.php?hello=/etc/passwd&hello_size=10240&hello_type=text/
plain&hello_name=hello.txt
Esto da las variables a las que el script espera asignarles valor, pero en vez de trabajar
con el archivo remoto trabaja con /etc/passwd (exponiendo el contenido del mismo).
Este ataque puede ser usado para exponer el contenido de cualquier archivo
(seguramente archivos de configuración).
Las versiones de PHP más actuales traen distintos métodos para determinar los archivos
remotos (HTTP_POST_FILES[] array). Incorpora funciones para no tener este
problema, por ejemplo una de ellas sirve para determinar si un archivo en particular es
uno de los que se hizo en el upload.
Algunos programadores llaman a sus librerías de una forma especifica, como puede ser
archivo.inc y normalmente no configuran el apache para este tipo de extensión sea
interpretada también como php, php4 o php3.
Cualquier atacante puede hacer un download de ese tipo de archivos sabiendo
únicamente su ubicación, es decir, si averigua que el archivo esta en
www.dominio.com/dir/archivo.inc ya sea por astucia del atacante o por suerte, esto
ocasiona un problema de seguridad. El atacante podría llegar a encontrar el login de un
usuario y su password para acceder a la BD del servidor, también estaría viendo el
código fuente, y para un atacante hábil es muy útil ver este código, porqué con él estaría
viendo, nombres de variables, configuración, estilo de programación, etc...
Una posible solución si usas archivos de la manera archivo.inc, es añadir una doble
extensión archivo.inc.php.
www.dominio.com/archivo.php?pagina=archivo
- 36 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
manejando código php. Decimos esto porque en la mayoría de los casos el apache, sobre
el cual corre el interprete de PHP esta configurado como nobody, así que los permisos
sobre los archivos están limitados.
Una solución sería es configurar php no habilitando las variables tomadas directamente
desde la entrada (ya que php las crea como globales dentro del script) y chequear
cualquier variable de entrada que este en el array HTTP_GET/POS_VARS[] o sacarla
directamente de ahí si “global var” esta desactivado.
Si se usa la configuración php por defecto se han de validar los archivos de entrada con
cualquier método comparándolos con los permitidos.
- 37 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
12.1 PDF
PHP ofrece la posibilidad de crear documentos PDF. Actualmente existen dos opciones
para hacer esto:
Se puede usar la PDF Library creada por Thomas Merz, pero presenta como
inconveniente que necesita dos módulos más (JPG library y TIFF library) que con
frecuencia dan problemas en la configuración de PHP.
Otra posibilidad es la de usar una librería de ANSI C, llamada ClibPDF. Esta librería le
permite crear documentos PDF pero no es gratuita. La funcionalidad y la API de
ClibPDF son similares a la PDFlib de Thomas Merz pero tiene la ventaja de que
ClibPDF es más rápido y crea documentos de menor tamaño y esto es un factor muy
importante al hablar de páginas web ya que cuanto mas tamaño tenga mayor será el
tiempo de carga.
- void cpdf_text ( int pdf_document, string text, double x-coor, double y-coor, int
mode, double orientation, int alignmode)
- 38 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
- void cpdf_set_font ( int pdf document, string font name, double size, string encoding)
- int cpdf_open_jpeg ( int pdf document, string file name, double x-coor, double y-
coor, double angle, double width, double height, double x-scale, double y-scale, int
mode)
Después de ver algunas de las funciones más importantes, para crear un documento en
PHP, veamos un ejemplo práctico:
<?php
$cpdf = cpdf_open(0);
cpdf_page_init($cpdf, 1, 0, 595, 842);
cpdf_set_font($cpdf, "Times-Roman", 30, "WinAnsiEncoding");
cpdf_text($cpdf, "Esto es un ejemplo de creación de un texto en pdf, utilizando PHP", 50, 750);
cpdf_finalize($cpdf);
cpdf_close($cpdf);
?>
Una posibilidad que nos ofrece PHP es la de imprimir documentos en el servidor. Posee
una serie de funciones que nos permiten conectar con una impresora determinada,
configurarla a nuestro gusto o elegir un tipo de fuente determinado y su tamaño entre
otras cosas.
Una posible utilidad que podría tener esto sería la creación de un administrador de
impresión para imprimir de forma remota o bien se podría usar para imprimir informes
sobre la web, aunque son muchas las aplicaciones que puede tener.
- 39 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
PHP nos permite crear un analizador de XML de forma que podemos obtener todas las
etiquetas que forman el archivo xml junto con los valores que toman. Actualmente no
existe mucha documentación sobre este soporte que ofrece PHP aunque suponemos que
no tardarán en sacar una información más completa.
- 40 - Universidad de Almería
Programación en Red - Ingeniería Informática Conozca PHP
13.- Documentación
http://www.php.net
http://www.php-hispano.net
http://www.ciberteca.net/
http://www.webestilo.com
http://php3.de/
http://phpline.vulcanonet.com/public/que.htm
http://www.desarrolloweb.com
http://www.datafull.com
Los creadores de este básico manual esperan que este trabajo les haya servido para
aprender de una forma rápida la potencia de este lenguaje.
- 41 - Universidad de Almería