Sunteți pe pagina 1din 21

<form action="" method="post">

Su nombre: <input type="text" name="nombre">


<input type="submit">
</form>
<?php
echo "Hola ".htmlspecialchars($_POST['nombre']);
?>

Como proteger los formularios y evitar la


inyeccin de cdigo SQL en PHP
Cdigos y ejemplos prcticos para impedir el hacking, inyeccin
SQL y el XSS en las pginas de un blog o sitio web. Como usar
captchas, convertir, bloquear y escapar caracteres peligrosos.
Como comprobar la seguridad de los formularios.

En las pginas de internet son muy empleados los formularios o


formas en diversos usos, para autentificarse, contactar, enviar
correos, agregar comentarios, hacer bsquedas, etc.
Hacen las pginas mucho ms atractivas, tiles e interactivas
para los lectores, pero traen un riesgo enorme para la seguridad
de un blog o sitio web.
Son la puerta de entrada de la gran mayora de los ataques, el
hacking, la inyeccin de cdigo SQL y XSS.

Qu es la inyeccin de cdigo SQL y los ataques


XSS?
Los ataques ms peligrosos en la actualidad que atentan contra
la seguridad de un sitio web son dos: La Inyeccin de cdigo SQL
y XSS, abreviaturas de Cross-site scripting.
Inyeccin SQL es la infiltracin de cdigo intruso dentro del
cdigo SQL de las bases de datos generalmente usando las

entradas de los formularios.


El objetivo es alterar el funcionamiento del programa y lograr
que se ejecute el cdigo "invasor" incrustado.
Es una tcnica poderosa con la que se puede manipular
direcciones URL de cualquier forma, en entradas de bsquedas,
formularios o registros de email, para inyectar el cdigo.
XSS es la inyeccin de cdigo JavaScript en aplicaciones web,
pginas web y hasta en el navegador web ya sea en cdigo
insertado (script, iframes) en HTML, aprovechando las variables
que se pasan entre pginas usando una URL o robando las
cookies.
Ataca principalmente las aplicaciones que procesan datos
obtenidos de una entrada sin ningn tipo de chequeo o
validacin.

Cmo evitar la inyeccin SQL y el XSS o Cross-site


scripting?
Hay varias reglas de seguridad elementales que debemos tener
en cuenta.
Principalmente proteger todas las puertas que abrimos en
nuestras pginas con la mejor de las intenciones, que son las
entradas en los formularios o cualquier elemento que utilice la
etiqueta <input>.
En este artculo tratamos solo algunas de ellas que son
imprescindibles.

Usar captchas en los formularios para validar las


peticiones de los usuarios

Captcha es la abreviatura en ingles de "Prueba de Turing pblica


y automtica para diferenciar mquinas y humanos".
Es una prueba para comprobar que quien introduce la
informacin es una persona y no una mquina.
Se utilizan para impedir que se pueda tener acceso a la funcin
de un script de forma automtica.
Para eso se emplean pequeas imgenes que representan
caracteres, en ocasiones distorsionados, los que el usuario tiene
que introducir en un cuadro manualmente y de coincidir, se
ejecuta la funcin solicitada.
Estas imgenes se escriben mediante PHP, creando un pequeo
archivo con solo unas lneas de cdigo y vincularlo al formulario
y viceversa.

Ejemplo de un formulario con un Captcha


El siguiente ejemplo muestra un sencillo formulario que al
introducir el texto correcto realiza una accin sencilla, en este
ejemplo escribe el valor de la variable que es el nombre
introducido por el usuario.
Introduce tu nombre:
Introduce los caracteres que ves en la imagen

GENERAR

El cdigo empleado en el formulario y en el archivo para crear la


imagen de la captcha, puedes copiarlo a continuacin.

Cdigo del formulario con un Captcha

Cdigo para crear una imagen en PHP


Para crear el archivo que escribe la imagen, copia el cdigo a un
archivo de texto y renmbralo como: "image.php"

Para personalizar la imagen creada puedes cambiar los valores


en las siguientes variables:
$img_handle. El ancho y la altura de la imagen
$back_color. El color del fondo
$txt_color. El color del texto
El tamao de la fuente es imposible hacerlo mayor a no ser que
uses un archivo de fuente TTF en el servidor y hagas referencia
a l.
Para crear una imagen es necesario que este habilitada la
librera GD incluida en PHP.
Lee ms informacin detallada y copia los cdigos para crear
imgenes con PHP, sencillas como esta o mucho ms vistosas y
accesibles: Cdigos para crear imgenes y grficos con PHP

Crear limitaciones y reglas en los formularios


En cualquier formulario es necesario usar ciertas reglas para

limitar las acciones de acuerdo a su uso.


Se debe utilizar como mtodo en los formularios POST en vez de
GET.
En las entradas para introducir contraseas, en ver de <input
type="text"> se debe emplear: <input type="password">
En las entradas de texto se puede limitar la cantidad de
caracteres usando el atributo "maxlength".
En los formularios usados para subir archivos como imgenes,
fotos, etc. puede limitarse el tipo de archivo a subir, basado en
su extensin, as como regular su tamao.
Lee ms informacin: Como subir fotos, imgenes y otros
archivos a un servidor web

Impedir la entrada de cdigo maligno escapando los


caracteres
Para evitar las inyecciones SQL y ataques XXS es necesario
escapar todo lo que pueda ser introducido en cualquier consulta,
reemplazando los caracteres especiales por su equivalente
textual, de tal forma que se interprete todo el contenido de la
variable como si fuera texto.
Se conoce como "satinizar" las entradas.
Para eso se pueden emplear distintas funciones, de acuerdo al
lenguaje de programacin usado.
En las entradas de los formularios que reciben comentarios y
texto se pueden usar los siguientes mtodos.

Convertir caracteres especiales con htmlspecialchars

Htmlspecialchars() es una funcin de PHP que convierte los


caracteres especiales en entidades HTML.
Convierte los siguientes caracteres:
& (ampersand) - &amp;
" (comillas dobles) - &quot;
' (comilla simple) - &#039;
< (menor que) - &lt;
> (mayor que) - &gt;
Se utiliza de la siguiente forma:
htmlspecialchars('texto a escapar')

Un ejemplo de su uso en un sencillo formulario:

Proteger formularios de XSS


La direccin URL en el atributo "action" de los formularios,
cuando conduce a la misma pgina donde se ejecuta, puede ser
manipulada para inyectar cdigo maligno usando Javascript.
Es uno de los mtodos de XSS (Cross-site scripting).
Se evita usando "htmlspecialchars()" de la siguiente forma:

Lee ms informacin detallada en W3School: PHP 5 Form


Validation

Escapar caracteres especiales con addslashes

La funcin addslashes() en PHP agrega barras invertidas a una


cadena.
Devuelve una cadena con barras invertidas delante de los
caracteres que necesitan escaparse en situaciones como
consultas de bases de datos, etc.
Los caracteres que se escapan son la comilla simple ('), comilla
doble ("), barra invertida (\) y NUL (el byte NULL).
Este mtodo se conoce como "satinizar".
Se utiliza de la siguiente forma:
addslashes ('texto a escapar')

Para usarlo en el formulario anterior solo es necesario agregar la


segunda lnea:
$consulta = $_POST['consulta'];
$consulta = addslashes($_POST['consulta']);
Puedes probar esta opcin en el primer formulario, insertando
alguna palabra que contenga cualquiera de los caracteres
anteriores.

Todas las funciones en un script


La funcin anterior htmlspecialchars, asi como addslashes() y
trim() podemos usarlas al mismo tiempo en las entradas de
cualquier formulario usando un script similar al siguiente.
Solo debemos definir las variables que usamos en nuestros

formularios.

Bloquear todos los caracteres especiales que no sean


letras ni nmeros
Es otro mtodo que devuelve un mensaje de error cuando se
introduce en una entrada los caracteres que no son aceptables.
Para eso se puede usar una funcin similar a la siguiente:

Comprueba la funcin anterior en el siguiente formulario,


tratado de introducir cualquier carcter no valido.
Introduce tu nombre:
GENERAR

Tu nombre es:

Como comprobar la seguridad de los formularios ante


inyecciones SQL
Las anteriores son solo algunas reglas elementales.
La lucha contra el hacking y los ataques en internet es muy

compleja y muchas las tcnicas utilizadas por los atacantes.


Usar scripts en PHP en las pginas siempre trae aparejado
mucho peligro.
Al implementar en cualquier pgina un formulario o cualquier
entrada, se puede probar su vulnerabilidad ante las inyecciones
SQL usando la extensin de FirefoxSQL Inject Me.
Comprobando si un formulario de esta pgina es vulnerable a la
inyeccin SQL con la extensin SQL Inject Me.

Otra extensin llamada XSS ME permite comprobar en cualquier


pgina o aplicacin web el peligro de ataques XSS.
Las dos extensiones anteriores simulan ataques en las formas
seleccionadas en una pgina y muestran el resultado.
Los de conocimientos ms avanzados y con ms paciencia
pueden encontrar en la siguiente pgina el cdigo para hacer
varias pruebas manualmente. Basic Tests for SQL-Injection
Vulnerabilities

Los que poseen sitios en WordPress deben leer en detalle el


siguiente artculo:Hardening WordPress

Sguenos en las redes sociales

Ataques de inyeccin SQL: qu


son y cmo protegerse

Comparte esta noticia Enlace permanente


Etiquetas: Ataques de inyeccin SQL, sql injection
La mayora de las aplicaciones web desarrolladas hoy en da hacen uso
de una base de datos para ofrecer pginas dinmicas y almacenar
informacin tanto de los usuarios como de la propia herramienta, datos
a los que se accede por medio del lenguaje SQL, un lenguaje para
interaccionar con bases de datos relacionales.
El uso de este tipo de lenguaje ha trado consigo la aparicin de una de
las vulnerabilidades ms peligrosas a la que nos podemos enfrentar. Nos
estamos refiriendo al ataque por inyeccin de cdigo SQL, una
vulnerabilidad que no slo pone en riesgo la integridad de la aplicacin,
sino de todos los datos almacenados de los usuarios que la utilicen, y
que se produce cuando no se filtra de forma correcta la informacin
enviada por los usuarios.
Leer White Paper: Ataques de inyeccin SQL. Qu son y cmo
protegerse

Qu es el ataque por inyeccin


SQL?

Consiste en la insercin de cdigo SQL por medio de los datos de


entrada desde la parte del cliente hacia la aplicacin. Es decir, por
medio de la insercin de este cdigo el atacante puede modificar las
consultar originales que debe realizar la aplicacin y ejecutar otras
totalmente distintas con la intencin de acceder a la herramienta,
obtener informacin de alguna de las tablas o borrar los datos
almacenados, entre otras muchas cosas.
Como consecuencias de estos ataques y dependiendo de los privilegios
que tenga el usuario de la base de datos bajo el que se ejecutan las
consultas, se podra acceder no slo a las tablas relacionadas con la
aplicacin, sino tambin a otras tablas pertenecientes a otras bases de
datos alojadas en ese mismo servidor.
Lo comentado anteriormente es posible gracias a que el uso de ciertos
caracteres en los campos de entrada de informacin por parte del
usuario, ya sea mediante el uso de los campos de los formularios que
son enviados al servidor mediante POST o bien por medio de los datos
enviados mediante GET en las urls de las pginas web, posibilitan
coordinar varias consultas SQL o ignorar el resto de la consulta,
permitiendo al hacker ejecutar la consulta que elija, de ah que sea
necesario realizar un filtrado de esos datos enviados para evitar
problemas.

Dentro de este tipo de ataques, nos podemos encontrar el


denominadoBlind SQL Injection, traducido al espaol como Ataque
a ciegas por inyeccin de SQL, que se da cuando en una pgina
web no aparece ningn mensaje de error al ejecutar una sentencia SQL
errnea, por lo que el atacante va realizando pruebas hasta dar con el
nombre de los campos o tablas sobre los que poder actuar.
Entre las bases de datos susceptibles a este tipo de ataques nos
encontramos MySQL, Oracle, Postgres o MS SQL.
Principales problemas que causan los ataques SQL Injection

Confidencialidad. De forma habitual, las bases de datos almacenan informacin


sensible, por lo que la prdida de confiabilidad es un problema muy frecuente en aquellos sitios
que son vulnerables a este tipo de ataques.
Autenticacin. Si el sistema de logueo que se utiliza para acceder a una zona
restringida de una web es dbil, por medio de este tipo de ataques se podra acceder sin la
necesidad de conocer ni el usuario ni la contrasea.
Integridad. Al igual que un ataque por inyeccin SQL permite leer informacin relevante
almacenada en la base de datos, tambin es posible realizar cambios o incluso borrar toda
informacin mediante este tipo de vulnerabilidad.

Cmo funciona un ataque SQL


Injection?
Para explicar mejor el funcionamiento de este tipo de ataques,
cogeremos el tipo formulario de logueo que existe prcticamente en
toda pgina web y que puede ser utilizado por el atacante como punto
de entrada a nuestra aplicacin.

Como es lgico, en esta explicacin supondremos que no se han tomado


las medidas necesarias que evitaran que este tipo de ataques se
pudiese llevar a cabo.
Cuando alguien rellena este formulario y pulsa el botn Login,
Acceder, Entrar o similar, est enviando esa informacin a una
sentencia SQL que ser ejecutada contra la base de datos de la
aplicacin, una instruccin que podra ser similar a la siguiente.
$sql = SELECT * FROM usuarios WHERE usuario = $usuario and
password = $pass;
Donde $usuario y $pass seran las variables que contendran los
valores introducidos por el visitante en cada uno de esos campos.

Un usuario comn ante este tipo de formularios introducira datos


normales como pepe y 12345, respectivamente, por lo que la
consulta a ejecutar quedara de la siguiente forma.
$sql = SELECT * FROM usuarios WHERE usuario = pepe and password
= 12345;
Pero, qu ocurrira si un atacante en el campo password agregara
OR 1 = 1? Es decir:
password = 12345 OR 1 = 1;
La respuesta es sencilla. El cdigo marcado con el color rojo sera la
inyeccin SQL, y ese simple cdigo nos podra permitir acceder a
aquellos sitios donde no se hubiesen tomado las medidas de seguridad
necesarias. La consulta en este caso quedara de la siguiente forma.
$sql= SELECT * FROM usuarios WHERE usuario = pepe and password =
12345 OR 1 = 1;

La instruccin anterior comprueba en la tabla usuarios si hay alguien


registrado con nombre de usuario pepe y si su contrasea es 12345 o
bien que 1 sea igual a 1. Como esto segundo siempre es cierto,
logaramos entrar al sistema con el usuario pepe sin saber su
verdadera contrasea.
En este punto quiero llamaros la atencin sobre el papel tan importante
que tienen las comillas simples. Nuestro cdigo malicioso, el que hemos
marcado con rojo, lo hemos empezado con una comilla simple. Con esto
hemos cerrado el contenido de la variable Password y al terminar
nuestro cdigo malicioso no hemos puesto ninguna comilla simple
porque suponemos que esa comilla de cierre ser la que ponga por
defecto el cdigo de la aplicacin.

Este ejemplo que hemos visto es uno de los ms sencillos, pero la


inyeccin de cdigo SQL podra ser utilizada para insertar cdigo ms
complejo que pudiese hacer otras funciones como listar datos o borrar
datos.

Medidas a tomar para protegerse


de las inyecciones SQL
A la hora de desarrollar una aplicacin, es muy complicado crear una
herramienta totalmente segura a las primeras de cambio. La falta de
tiempo y la intervencin de varios programadores para su desarrollo, son
factores que juegan en contra de la seguridad. A pesar de estos
inconvenientes, siempre se pueden tomar medidas de seguridad que
nos ayuden a desarrollar aplicaciones ms robustas, ajenas a este tipo
de problemas.
Veamos a continuacin algunos consejos para evitar sufrir el ataque por
inyeccin de cdigo SQL en nuestros desarrollos:
a)

Escapar los caracteres especiales utilizados en las

consultas SQL
Al hablar de escapar caracteres estamos haciendo referencia a aadir
la barra invertida \ delante de las cadenas utilizadas en las consultas
SQL para evitar que estas corrompan la consulta. Algunos de estos
caracteres especiales que es aconsejable escapar son las comillas
dobles (), las comillas simples () o los caracteres \x00 o \x1a ya que
son considerados como peligrosos pues pueden ser utilizados durante
los ataques.
Los distintos lenguajes de programacin ofrecen mecanismos para lograr
escapar estos caracteres. En el caso de PHP podemos optar por la
funcin mysql_real_scape_string(), que toma como parmetro una

cadena y la modifica evitando todos los caracteres especiales,


devolvindola totalmente segura para ser ejecutada dentro de la
instruccin SQL.

b)

Delimitar los valores de las consultas

Aunque el valor de la consulta sea un entero, es aconsejable delimitarlo


siempre entre comillas simples. Una instruccin SQL del tipo:

SELECT nombre FROM usuarios WHERE id_user = $id

Ser mucho ms fcilmente inyectable que:

SELECT nombre FROM usuarios WHERE id_user = $id

Donde $id es un nmero entero.

c)

Verificar siempre los datos que introduce el usuario

Si en una consulta estamos a la espera de recibir un entero, no


confiemos en que sea as, sino que es aconsejable tomar medidas de
seguridad y realizar la comprobacin de que realmente se trata del tipo
de dato que estamos esperando. Para realizar esto, los lenguajes de
programacin ofrecen funciones que realizan esta accin, como pueden

ser ctype_digit() para saber si es un nmero o ctype_alpha () para saber


si se trata de una cadena de texto en el caso del lenguaje PHP.
Tambin es aconsejable comprobar la longitud de los datos para
descartar posibles tcnicas de inyeccin SQL, ya que si por ejemplo
estamos esperando un nombre, una cadena extremadamente larga
puede suponer que estn intentando atacarnos por este mtodo. En el
caso de PHP, podemos utilizar la funcin strlen() para ver el tamao de
la cadena.
d)

Asignar mnimos privilegios al usuario que conectar con

la base de datos
El usuario que utilicemos para conectarnos a la base de datos desde
nuestro cdigo debe tener los privilegios justos para realizar las acciones
que necesitemos. No utilizar nunca un usuario root con acceso a todas
las bases de datos ya que de esta forma estaremos dando facilidades a
los hackers para que puedan acceder a toda la informacin.
e)

Programar bien

Aunque pueda parecer una tontera, no hay mejor medida para evitar
este tipo de ataques que realizar una buena programacin, poniendo en
prctica las necesidades bsicas y el inters para desarrollar una
aplicacin totalmente segura.
Adems de las medidas que podemos tomar a la hora de implementar el
cdigo, siempre podemos acudir a auditoras de cdigo para
asegurarnos de que no hemos dejado ningn tipo de puertas abiertas,
aunque suelen ser procesos caros realizados por terceras empresas.

S-ar putea să vă placă și