Documente Academic
Documente Profesional
Documente Cultură
Introducción
En esta Unidad vamos a crear, leer y modificar documentos XML utilizando
las bibliotecas de PHP.
1
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
<mensaje>Texto de ejemplo</mensaje>
Hay que tener en cuenta que XML distingue mayúsculas y minúsculas (es
case-sensitive). Por lo tanto, el elemento siguiente es diferente:
<Mensaje>Texto de ejemplo</Mensaje>
Elementos XML
2
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
<colección>
<película>
<directores>
<director>James Cameron</director>
</directores>
</película>
</colección>
Atributos XML
Comentarios
3
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
Los documentos XML deben mantener una estructura correcta cumpliendo con
las reglas del W3C. Puedes usar la siguiente página para comprobar que un
documento XML es correcto según el estándar:
http://www.w3schools.com/X ML/xml_validator.asp
El ecosistema XML
4
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
SimpleXml
DOM
Depende un poco del proyecto que estemos desarrollando elegir una u otra
biblioteca. DOM permite acceder y manipular los documentos XML de forma
más completa; sin embargo, la curva de aprendizaje es más pronunciada ya
que la API es algo más compleja si la comparamos con SimpleXML, que nos
permite tratar documentos XML de una manera sencilla e intuitiva, como bien
dice su nombre.
5
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
<?php
$filename = "discos.xml";
echo "<p>Leemos los datos del fichero: $filename";
/*
Si descomentas estas sentencias, puedes ver el xml en crudo
echo "<PRE>";
foreach( $musica as $elemento )
{
print_r( $elemento );
}
*/
?>
6
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
7
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
8
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
Atención: no dudes en utilizar la ayuda de PHP para ver con ejemplos cómo
se usan éstas y otras funciones disponibles en ambas bibliotecas.
try
{
/***Creamos objeto DOM ***/
$dom = new domDocument;
/*** Indicamos que el formato de salida debe ir tabulado ***/
$dom->formatOutput = true;
/*** Codificación UTF-8 ***/
$dom->encoding='utf-8';
9
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
$telefono = $telefonos->addChild("teléfono",
$valor['Telefono_movil']);
/*** Atributo teléfono 1 ***/
$telefono->addAttribute("tipo", "móvil");
/*** Teléfono 2 ***/
$telefono = $telefonos->addChild("teléfono",
$valor['Telefono_oficina']);
/*** Atributo teléfono 2 ***/
$telefono->addAttribute("tipo", "oficina");
/*** Teléfono 3 ***/
$telefono = $telefonos->addChild("teléfono",
$valor['telefono']);
/*** Atributo teléfono 3 ***/
$telefono->addAttribute("tipo", "fijo");
/*** Correo electrónico ***/
$contacto->addChild("email", $valor['email']);
/*** Notas ***/
$contacto->addChild("notas", $valor['notas']);
}
$db=0;
/*** Guardamos el archivo xml ***/
$dom->save($filename);
}
catch( Exception $e )
{
echo "ERROR: al crear el documento XML: ". $e->getMessage();
}
print_r($agenda->xpath("//*[nombre='Jaime']"));
10
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
11
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
12
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
13
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
En esta segunda Unidad del Curso avanzado de PHP 5 vamos a explicar estas
funciones y las aplicaremos en algunos de los ejemplos que integran este
segundo bloque del curso.
Las funciones COM son una vía que permite identificar e intercambiar
información entre objetos y componentes de diferentes sistemas, arquitecturas,
lenguajes y máquinas. COM es el modelo más usado para conectar software
de diferentes fabricantes. Proporciona un amplio conjunto de herramientas
cliente-servidor de servicios integrados, fáciles de usar y eficientes en la
conexión de los componentes de variados lenguajes.
Para obtener más información sobre lo que se puede hacer con las clases y los
objetos mediante las funciones COM, aconsejamos acceder a la dirección
http://www.microsoft.com/com/ .
14
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
15
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
Lo primero que hacemos al integrar las funciones COM dentro de los scripts
PHP es comprobar que la biblioteca está cargada en el servidor PHP
correctamente escribiendo las siguientes sentencias:
if (!extension_loaded('com_dotnet')) {
die ("ERROR: la biblioteca COM_DOTNET no está habilitada en este
servidor PHP. No se puede continuar la ejecución.");
}
Después, tenemos que utilizar la clase COM de esta biblioteca. Es decir, dentro
de PHP, COM se comporta como una clase de la que es preciso siempre hacer
al menos una instancia creando un objeto. Así pues, para poder usar las
funciones que vamos a explicar a continuación, es necesario crear un objeto
con la sentencia new COM. En el Ejemplo 3, donde accedemos desde PHP a MS
Word, usamos esta instrucción para crear el objeto:
16
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
Siguiendo con el Ejemplo 3, una vez que hemos creado el objeto $word,
podemos llevar a cabo estas operaciones:
$word->Visible = 1;
$word->Documents->Add();
$word->Selection->Font->size=16;
$word->Selection->Font->bold=true;
5. Escribir un texto
6. Guardar el documento
$word->Documents[1]->SaveAs($nombre_fichero);
17
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
Siguiendo con el Ejemplo 4, una vez que hemos creado el objeto $excel,
podemos llevar a cabo estas operaciones:
$excel->Application->DisplayAlerts = False;
$excel->application->Workbooks->Open($nombre_fichero);
$excel->Application->ActiveWorkbook->SaveAs($nombre_fichero_copia);
$excel->Application->Visible = True;
18
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
7. Guardamos el documento
$excel->Application->ActiveWorkbook->SaveAs($nombre_fichero_copia);
19
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
20
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
A día de hoy todos los navegadores de Internet soportan este tipo de etiqueta.
Además, en las sentencias que tratan los ficheros subidos al servidor se lleva a
cabo una validación de su tamaño y formato antes de iniciar la conversión a
Word.
Atención: la primera ver que ejecutes este Ejemplo puede ocurrir que Office
solicite la instalación del conversor correspondiente:
Debes seguir las instrucciones del instalador para poder ver cómo funciona
esta programa conversor.
21
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
¿Cómo podemos saber qué identificador debemos usar para referirnos a cada
aplicación? No siempre es fácil. Lo más directo es buscar en nuestro ordenador
el documento de ayuda “Referencia de Microsoft Forms Visual Basic”, que
suele estar en alguna de las carpetas de MS. Por ejemplo, en nuestro
ordenador, que tiene instalada la versión 7 de Windows, en la carpeta
C:\Program Files\Microsoft Office 15\root\vfs\ProgramFilesCommonX86\
Microsoft Shared\VBA\VBA7.1\3082 está el fichero FM20.CHM. En éste y en
otros muchos documentos de ayuda que tienen la extensión CHM pueden
encontrarse muchas de las informaciones necesarias para poder hacer
referencia a los nombres de los módulos, propiedades, métodos y eventos de
cada aplicación.
22
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
http://msdn.microsoft.com/library/officedev/off2000/xltocobjectmodelapplication.htm
23
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
PHP utiliza la biblioteca mcrypt para cifrar datos. Esta biblioteca soporta una
gran variedad de algoritmos de bloque como DES, TripleDES, Blowfish (por
defecto), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 y GOST
en los modos de cifrado CBC, OFB, CFB y ECB. Adicionalmente, soporta RC6
e IDEA, que son algoritmos "no-libres".
24
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
• MCRYPT_3DES
• MCRYPT_ARCFOUR_IV (solo mcrypt > 2.4.x)
• MCRYPT_ARCFOUR (solo mcrypt > 2.4.x)
• MCRYPT_BLOWFISH
• MCRYPT_CAST_128
• MCRYPT_CAST_256
• MCRYPT_CRYPT
• MCRYPT_DES
• MCRYPT_DES_COMPAT (solo mcrypt 2.2.x)
• MCRYPT_ENIGMA (solo mcrypt > 2.4.x, alias de MCRYPT_CRYPT)
• MCRYPT_GOST
• MCRYPT_IDEA (no libre)
• MCRYPT_LOKI97 (solo mcrypt > 2.4.x)
• MCRYPT_MARS (solo mcrypt > 2.4.x, no libre)
• MCRYPT_PANAMA (mcrypt > 2.4.x only)
• MCRYPT_RIJNDAEL_128 (solo mcrypt > 2.4.x)
• MCRYPT_RIJNDAEL_192 (solo mcrypt > 2.4.x)
• MCRYPT_RIJNDAEL_256 (solo mcrypt > 2.4.x)
• MCRYPT_RC2
• MCRYPT_RC4 (solo mcrypt 2.2.x)
• MCRYPT_RC6 (solo mcrypt > 2.4.x)
• MCRYPT_RC6_128 (solo mcrypt 2.2.x)
• MCRYPT_RC6_192 (solo mcrypt 2.2.x)
• MCRYPT_RC6_256 (solo mcrypt 2.2.x)
• MCRYPT_SAFER64
• MCRYPT_SAFER128
• MCRYPT_SAFERPLUS (solo mcrypt > 2.4.x)
• MCRYPT_SERPENT (solo mcrypt > 2.4.x)
• MCRYPT_SERPENT_128 (solo mcrypt 2.2.x)
• MCRYPT_SERPENT_192 (solo mcrypt 2.2.x)
• MCRYPT_SERPENT_256 (solo mcrypt 2.2.x)
• MCRYPT_SKIPJACK (solo mcrypt > 2.4.x)
• MCRYPT_TEAN (solo mcrypt 2.2.x)
• MCRYPT_THREEWAY
• MCRYPT_TRIPLEDES (solo mcrypt > 2.4.x)
• MCRYPT_TWOFISH MCRYPT_TWOFISH128
• MCRYPT_TWOFISH192
• MCRYPT_TWOFISH256
• MCRYPT_WAKE (solo mcrypt > 2.4.x)
• MCRYPT_XTEA (solo mcrypt > 2.4.x)
Algunos de estos cifrados, como los modos CFB, OFB o CBC, exigen llevar un
vector de inicialización (IV) en la correspondiente función de cifrado. El IV debe
ser único y el mismo para cifrar y descifrar.
25
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
En el Ejemplo 6 de esta Unidad hemos usado el cifrado AES 256, que fue
diseñado en 2000 por el NIST norteamericano y se utiliza hoy en día por la
seguridad que ofrece. Además, notamos que los sistemas de clave simétrica
son, en general, más rápidos que los de clave asimétrica.
• mcrypt_module_open(MCRYPT_RIJNDAEL_256,"", MCRYPT_MODE_ECB,"")
para abrir el módulo del algoritmo que vamos a utilizar
MCRYPT_RIJNDAEL_256 (AES 256) e indicar el modo
MCRYPT_MODE_ECB. Esta función devuelve un identificador de
cifrado o False si se ha producido algún error. El primero de los cuatro
parámetros indica el tipo de cifrado o algoritmo de cifrado que se va a
utilizar. En el segundo parámetro se indica dónde está este módulo, es
decir, el directorio donde está el fichero que lo contiene. Si no se indica
nada, hay que poner una cadena vacía, como en esta instrucción, y se
asume que el módulo está en el directorio por defecto (directiva
mcrypt.algorithms_dir). En el tercer parámetro se indica el modo de
cifrado. En el cuarto parámetro se indica dónde está este modo, es
decir, el directorio donde está el fichero que lo contiene. Si no se indica
nada, hay que poner una cadena vacía, como en esta instrucción, y se
asume que el módulo está en el directorio por defecto (directiva
mcrypt.modes_dir). El módulo abierto se cierra con la función
mcrypt_module_close().
• mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND) para
crear un vector de inicialización (IV) que sirve de semilla para iniciar el
proceso de cifrado. En el primer parámetro debemos indicar el tamaño
(size) de este vector. Para ello, nos servimos de la función
mcrypt_enc_get_iv_size($td), que devuelve el tamaño del módulo de
cifrado creado en la instrucción anterior. Esta última función lleva como
argumento el nombre del identificador de cifrado. En el segundo
parámetro de la función mcrypt_create_iv se indica la fuente de la
semilla de cifrado. Ésta puede ser MCRYPT_RAND (generador de números
aleatorios del sistema), MCRYPT_DEV_RANDOM (que lee datos de
/dev/random) y MCRYPT_DEV_URANDOM (que lee datos de /dev/urandom).
Estos dos últimos procedimientos generadores de números aleatorios
sólo están disponibles en muchos sistemas Unix. En el caso de que
usemos la fuente MCRYPT_RAND hay que asegurarse de llamar antes a la
función srand() para inicializar el generador de números aleatorios,
como hemos hecho en una instrucción anterior.
26
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
27
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
<?
ob_start();
echo "Hola\n";
setcookie ("nombre_cookie", "datos_cookie");
ob_end_flush();
?>
Atención: hay que tener en cuenta que el servidor PHP de XAMPP activa la
caché automáticamente por defecto y este script no mostraría el error descrito
anteriormente. En su archivo php.ini de configuración se indica la directiva
28
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
<?php
// Empezamos a guardar lo que se va a enviar al navegador del usuario
ob_start();
?>
<HTML>
<HEAD><TITLE>Sin título</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
table.con_borde { margin: 1em; border: 1px solid #ccc; }
td, th { padding: .3em; font-family:verdana;
font-size:12px;
color:navy;
}
</style>
</HEAD>
<BODY>
<CENTER>
29
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
<?php
?>
30
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
31
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
32
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
33
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
34
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
Este último mensaje de error indica que no se están validando los datos de
entrada y que, además, las consultas SQL de la base de datos están
delimitadas por comillas simples. ¿Por qué?
35
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
Ahora que sabemos que la consulta está delimitada por comillas simples,
podemos escribir un texto que modificará la consulta y hará que la aplicación
piense que hemos introducido las credenciales de un usuario legítimo ya
registrado. En concreto, vamos a introducir este texto en el campo “Clave”:
36
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
De igual forma que en el caso anterior, los nombres de las tablas se pueden
averiguar mediante la técnica de prueba y error. De nuevo, introducimos texto
que construye consultas en las que aparezcan posibles nombres de las tablas.
En el caso de que las consultas indiquen un error, entonces el nombre es
incorrecto; si, por el contrario, no ocurre así, es que hemos acertado con el
nombre de las tablas.
37
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
38
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
La técnica consiste en incluir una sentencia SQL que borre una tabla en el
campo “Clave”:
39
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
40
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
Veamos ahora cómo hemos fortalecido la aplicación del Ejemplo 8 para que
sea robusta frente a ataques del tipo Inyección SQL.
En el archivo index.php podemos ver que hemos incluido un código que evita
que un atacante pueda escribir más de una palabra en los campos “usuario” y
“clave”, así evitamos que se pueda introducir sentencia SQLs que necesitan
espacios en blanco:
41
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
Así, sólo dejamos que se busque por el campo “usuario” y evitamos puntos de
entrada a la Inyecciones SQL.
42
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
El uso del método prepare() de PDO evita las inyecciones SQL ya que valida
el contenido de la consulta y sólo permite que se envíe al servidor un única
consulta evitando así que un atacante concatene varias consultas. Además,
hemos incluido la constante DBMuestraErrores que usamos para marcar si se
deben mostrar los errores de ejecución a la hora de depurar la aplicación
cuando sea necesario. Cuanta menos información demos al usuario con malas
intenciones, más difícil será que éste consiga acceder al contenido privado.
43
Curso Avanzado de PHP
Unidad 2: Funciones avanzadas de PHP
Resumen
44