Está en la página 1de 37

Desarrollo de sitios web

con PHP y MySQL

Tema 6: Creacin de imgenes

Jos Mariano Gonzlez Romano


mariano@lsi.us.es
Creacion de Imgenes y Seguridad

Diseo de Aplicaciones Web


Creacin de imgenes

1. Introduccin
2. Imgenes dinmicas en PHP
3. Funciones de biblioteca para la creacin de
imgenes
4. Ejercicios
Introduccin
PHP dispone de una biblioteca de funciones para la generacin
dinmica de imgenes
Estas funciones son particularmente interesantes para generar
grficos estadsticos actualizados al instante
Formatos: GIF, PNG, JPEG
Configuracin:
Requiere el uso de la librera php_gd2.dll (Windows) o gd.so
(Unix, Linux)
Debe activarse la extensin correspondiente en el fichero
php.ini:

extension = php_gd2.dll
extension = gd.so
Imgenes dinmicas en PHP
Procedimiento general:

imagen.php
<?PHP
header (Content-type: image/png);

$imagen = imagecreate (300, 200); // ancho x alto

// instrucciones grficas

imagepng ($imagen);
imagedestroy ($imagen);
?>

llamada
<IMG SRC=imagen.php>
Imgenes dinmicas en PHP

(0,0) x

(ancho,alto)
Funciones de biblioteca
Colores
$color = imagecolorallocate ($imagen, R, G, B)
Formas geomtricas
imagerectangle ($imagen, x0, y0, x1, y1, $color)
imagefilledrectangle
imagearc ($imagen, xc, yc, ancho, alto, gi, gf, $color)
imagefilledarc

(x0, y0)
(xc, yc)

gi

(x1, y1)
gf
Funciones de biblioteca
Fondos
$imagen = imagecreatefrompng (imagen.png)
$imagen = imagecreatefromjpeg (imagen.jpg)
Textos
imagestring ($imagen, tamao, x, y, $texto, $color)
Guardar imgenes
imagepng ($imagen, imagen.png);
imagejpeg ($imagen, imagen.jpg);
Ejercicios
Ejercicio 1: creacin de imgenes simples
Ilustra cmo crear un grfico de tarta
Ejercicios
Ejercicio 2: encuesta
Ilustra cmo utilizar un grfico de tarta para mostrar los
resultados de una encuesta
Tema 7: Seguridad

1. Seguridad en las aplicaciones web


2. Seguridad en PHP
3. Variables globales
4. Nombres de ficheros
5. Subida de ficheros
6. Bibliotecas
7. Formularios
8. Inyeccin SQL
Seguridad en las aplicaciones web

Cunta seguridad es necesaria?


La seguridad supone un coste econmico y de eficiencia. Hay
que disponer de la adecuada, ni ms ni menos
Reglas:
El riesgo cero no es prctico
Hay diversas formas de mitigar el riesgo
No se puede gastar un milln para proteger un cntimo
Seguridad en las aplicaciones web

Amenazas ms importantes: Top 10


The Open Web Application Security Project (OWASP)
The Ten Most Critical Web Application Security Vulnerabilities
(2007) http://www.owasp.org/documentation/topten
1. Cross Site Scripting (XSS)
2. Injection Flaws
3. Malicious File Execution
4. Insecure Direct Object Reference
5. Cross Site Request Forgery (CSRF)
6. Information Leakage and Improper Error Handling
7. Broken Authentication and Session Management
8. Insecure Cryptographic Storage
9. Insecure Communications
10. Failure to Restrict URL Access
Seguridad en las aplicaciones web

Seguridad en el cliente
Cdigo mvil
Seguridad en el servidor
Servidor web, servidor de bases de datos, lenguajes de servidor
Seguridad en la aplicacin
Control de acceso
Validacin de datos de entrada
Programacin segura
Seguridad en la comunicacin
Certificados digitales, SSL
Seguridad en PHP

Primera recomendacin:
Disponer siempre de versiones actualizadas de Apache y PHP
Aspectos de PHP que pueden dar lugar a vulnerabilidades:
Variables globales
Nombres de ficheros
Subida de ficheros
Bibliotecas
Datos enviados desde formularios
Variables globales

Cuando register_globals est activado en el fichero php.ini,


PHP crea automticamente variables globales a partir de los
datos de los formularios y de las cookies
Esto puede dar lugar a problemas como en el ejemplo
siguiente:

<?PHP
if (comprueba_privilegios())
$superuser = true;
...
?>
Variables globales

Una llamada a este script de la forma


pagina.php?superuser=1
permitira obtener privilegios de superusuario
Para resolver este problema existen tres soluciones:
Deshabilitar register_globals en el fichero php.ini
Inicializar las variables
Establecer el orden de las variables en PHP
Variables globales

Deshabilitar register_globals en el fichero php.ini


La directiva register_globals del fichero php.ini establece si se
admite o no la creacin automtica de variables globales
A partir de PHP 4.2.0 el valor por defecto de esta directiva es off,
que es el valor recomendable
Variables globales

Inicializar las variables


El problema anterior se soluciona dando un valor inicial a la
variable $superuser:

<?PHP
$superuser = false;
if (comprueba_privilegios())
$superuser = true;
...
?>
Variables globales

Inicializar las variables


Es recomendable inicializar todas las variables antes de usarlas.
Se puede usar la directiva error_reporting=E_ALL en php.ini para
que se muestre un aviso cuando se use una variable que no haya
sido previamente inicializada
En un entorno de produccin debe evitarse la aparicin de
mensajes de aviso o error. Para ello se utilizan las siguientes
directivas en php.ini:
display_errors = off
log_errors = on
error_log = /var/log/php_errors.log
Los errores irn al fichero especificado en lugar de mostrarse en la
pantalla
Variables globales

Establecer el orden de las variables en PHP


PHP crea automticamente variables globales a partir del entorno
(E), las cookies (C), la informacin del servidor (S) y los
parmetros GET (G) y POST (P)
La directiva variables_order controla el orden de estas variables. El
valor por defecto es EGPCS
Permitir la creacin de variables globales desde parmetros GET y
POST y desde cookies es potencialmente peligroso. Un posible
valor para variables_order que evita esto es ES
En tal caso para acceder a los parmetros de los formularios y a
las cookies se deben utilizar los arrays globales $_REQUEST,
$_GET, $_POST y $_COOKIES
Variables globales

Establecer el orden de las variables en PHP


Si se modifican las directivas register_globals y/o variables_order
es preciso revisar los scripts existentes para adaptarlos a las
nuevas circunstancias
Una forma puede ser la siguiente:

$edad = $_REQUEST[edad];
...
Nombres de ficheros

Es relativamente fcil construir un nombre de fichero que se


refiera a algo distinto a lo que se pretende
Sea el siguiente cdigo:

include (/usr/local/lib/bienvenida/$username);

Este cdigo pretende mostrar un mensaje de bienvenida


personalizado para el usuario. Aparentemente no es peligroso,
pero qu ocurrira si el usuario introduce como nombre la
cadena ../../../../etc/passwd?
Se mostrara el fichero de passwords del sistema
Nombres de ficheros

Adems hay que tener en cuenta que las funciones de manejo


de ficheros como include() o require() admiten nombres de
ficheros remotos, lo que podra provocar la ejecucin de
cdigo maligno cargado de otro servidor. Sea, por ejemplo, el
cdigo
include ($libdir . /conecta.php);
Si un atacante modifica el valor de la variable $libdir a,
pongamos por caso, http://atacante/, y coloca en la raz del
mismo un fichero de nombre conecta.php, su cdigo sera
ejecutado
Se puede desactivar la funcionalidad de acceso a ficheros
remotos con la siguiente directiva en php.ini:
allow_url_fopen = off
Nombres de ficheros

Para chequear nombres de ficheros se utilizan las funciones


realpath() y basename(). La primera convierte direcciones
relativas en absolutas y la segunda toma una ruta y devuelve la
parte correspondiente al nombre del fichero. Ejemplo:

$file = $_POST[username];
$file2 = basename (realpath($file));
if ($file2 != $file)
die ($file no es un username vlido);
include (/usr/local/lib/bienvenida/$file);
Nombres de ficheros

Otra defensa contra los nombres de ficheros incorrectos es la


directiva de php.ini open_basedir:

open_basedir = /alguna/ruta

PHP limitar las operaciones sobre ficheros al directorio


especificado y sus subdirectorios:

include (/alguna/ruta/lib.inc); // permitido


include (/otra/ruta/lib.inc); // da error
Subida de ficheros

La subida de ficheros permite a un usuario enviar cualquier


fichero al servidor, lo cual encierra un gran peligro ya que un
atacante puede subir un cdigo maligno y luego ejecutarlo,
causando ms dao que cuando se incluye el cdigo desde un
servidor remoto
Como recomendacin general, debe evitarse utilizar el nombre
enviado por el navegador (podra ser, por ejemplo,
/etc/passwd). Es conveniente generar un nombre nico para el
fichero subido
Subida de ficheros

Otro peligro es el tamao de los ficheros. Aunque se limite el


tamao mximo en el formulario, los ficheros se reciben
automticamente y luego se comprueba su tamao
Es posible que un usuario intente provocar un ataque de
denegacin de servicio enviando varios ficheros de gran
tamao a la vez y llenando el sistema de ficheros utilizado por
PHP para almacenarlos
Para evitar esto se puede utilizar la directiva post_max_size de
php.ini. El valor por defecto suele ser ms elevado de lo
necesario
El campo oculto MAX_FILE_SIZE en los formularios es
conveniente porque evita que comience la subida de un fichero
si supera el tamao permitido, pero puede saltarse con
facilidad, por lo que no es suficiente. La directiva de php.ini s lo
es
Bibliotecas

Es conveniente almacenar los ficheros de biblioteca fuera de la


raz de la web para evitar que puedan ser accedidos por su
URL
En tal caso debe hacerse saber a PHP la ubicacin de los
ficheros indicando la ruta completa en los include() y require() o
bien mediante la directiva include_path en php.ini

include_path = .:/usr/local/php:/usr/local/lib/myapp

Esto es particularmente importante cuando en el cdigo de la


biblioteca aparecen passwords, como es el caso de las
funciones de conexin con bases de datos
Formularios

Es recomendable validar todos los datos provenientes de


formularios para asegurarse de que los valores recibidos son
los esperados
En general, cualquier informacin proveniente del exterior debe
contemplarse como posiblemente contaminada y debe ser
verificada antes de ser utilizada
Sea el siguiente ejemplo:

print (Nombre: . $nombre);


print (Comentario: . $comentario);
Formularios

Si el autor del comentario introdujo algn cdigo HTML en el


texto del mismo, el cdigo ser interpretado y sus efectos
podran ser graves
Para evitar esto se puede utilizar la funcin htmlspecialchars(),
que impide que se interpreten los caracteres especiales de
HTML (<, >, &)
El cdigo quedara de la siguiente manera:

print (Nombre: . $nombre);


print (Comentario: . htmlspecialchars($comentario));
Inyeccin SQL

Inyeccin
Consiste en inyectar en la aplicacin datos introducidos por el
usuario. Esto es muy habitual y de por s no es peligroso
Ejemplo: sea la instruccin

sql= "SELECT * FROM noticias WHERE id = $id";

Pulsando en el artculo de inters para el usuario se convierte


en:

sql= "SELECT * FROM noticias WHERE id = 228";


Inyeccin SQL

Inyeccin SQL
Consiste en inyectar un mandato dentro de una consulta SQL.
Sea la consulta:

$consulta = SELECT titulo FROM libros WHERE codigo


= $codigo;

siendo $codigo un valor introducido desde un formulario. Si el


valor es 23 la consulta ser:

SELECT titulo FROM libros WHERE codigo = 23

Si el valor es 23; DROP TABLE users la consulta es:


SELECT titulo FROM libros WHERE codigo = 23; DROP
TABLE users

que destruira la tabla de usuarios de MySQL


Inyeccin SQL

Inyeccin SQL
Sea ahora el siguiente cdigo muy habitual en una aplicacin
Web:

$consulta = SELECT id FROM usuarios WHERE username


= $username AND password = $password;

Si se introducen los valores juan como username y Ag3n.da


como password, la consulta queda:

SELECT id FROM usuarios WHERE username = juan AND


password = Ag3n.da
Inyeccin SQL

Inyeccin SQL
Se puede saltar la comprobacin del password introduciendo el
valor juan-- como username o el valor OR = como
password. Las consultas que quedaran en ambos casos son,
respectivamente:

SELECT id FROM usuarios WHERE username = juan--


AND password =
SELECT id FROM usuarios WHERE username = juan AND
password = OR =

En el primer caso ntese que -- es un comentario de lnea en


MySQL y provoca que se ignore todo lo que viene tras l en la
lnea
Inyeccin SQL

Inyeccin SQL
La inyeccin SQL puede utilizarse para:
Cambiar valores de las consultas
Concatenar varias consultas
Aadir llamadas a funcin y procedimientos almacenados a una
consulta
Para evitar la inyeccin SQL es muy importante validar los
valores que se han de integrar en la consulta SQL. En el
primer caso, por ejemplo, $codigo debe ser un valor entero
Resumen

De todo lo anterior podemos concluir las recomendaciones


siguientes:
Validar todos los datos de entrada de la aplicacin
Aceptar nicamente datos vlidos conocidos
Rechazar datos no vlidos conocidos
Sanear todos los datos
Configurar adecuadamente PHP a travs del fichero php.ini
Seguir unas buenas prcticas en la programacin
Hay que tener en cuenta que cualquier cambio en la
configuracin de PHP afectar a los scripts de todos los
usuarios y posiblemente a algunas herramientas, lo cual debe
ser tenido en cuenta y estudiarse sus consecuencias antes de
proceder a realizarlos

También podría gustarte