martes, 5 de febrero de 2008

Recuperar con PHP variables pasadas por URL y formularios de forma segura


Comunmente se utiliza el paso de paramétros por url para
realizar búsquedas en bases de datos o para pasar información
relacionada con las preferencias de un usuario de una página a
otra por medio de expresiones como esta

script.php?id=2&tema=1...

si nuestro php.ini tiene configurado register_globals
= Off


deberia accederse a las variables pasadas con superglobales
$_GET['id'] o $_GET['tema'] que igualmente no deja de ser
inseguro sin los filtros adecuados

pero una aplicación que no tenga los filtros adecuados y con
php.ini seteado con

register_globals = On el problema aun es
mayor ya que una acción directa del tipo

script.php?id=2&tema=1&crack=loquesea...

puede comprometer todo el sistema, sobre todo si no se realiza
ninguna comprobación previa de lo que es ingresado.

siguiendo el ejemplo anterior ¿que pasaria además si alguien
colocara un apóstrofe y forzara algún tipo de consulta SQL?
este tipo de ataque es conocido como "inyección sql".
o ejecutar una acción directa en el servidor? directamente un
acceso al shell de tu server.

Hay muchos proveedores de hosting que traen por defecto la
configuración más segura para PHP, pero nunca hay que fiarse de
esto, y recordar que el arte de programar es anticipar posibles
acciones si... para ello bien dice el refrán "mejor
prevenir que curar" y parsear todo lo que ingresan a nuestra
aplicación,

Hay funciones incorporadas en PHP que manejan el filtrado de
los datos antes de procesarlos pero no los voy a tratar aqui solo
mostraré una forma de filtrar todo lo que ingrese desde el
"exterior" de nuestra aplicación con una función
propia

este código no es la panacea a todos los males de seguridad
pero es un pequeño aporte para desarrollar futuras aplicaciónes
más robustas

explicación

Mediante un bucle foreach iteramos las
posibles variables ingresadas desde el "exterior" a
través de POST, GET o COOKIES
y expresión regular mediante filtramos todo los
caracteres que pueden comprometer la seguridad de nuestra
aplicación mostrando un mensaje de error y cortando la
ejecución si hay algo extraño.

<?php
foreach ($_REQUEST as $key=>$value) {if (eregi("[\'\/*%,\<\>=]",$value)){die('Intento de ataque!');}}
?>
Reacciones:

0 comentarios: