Aumentar Disminuir

Autor: Harold Flores Tecnicos, PHP, Linux, apache.
Concepto Ataque XSS
Concepto Ataque XSS
[ Agrandar ]
Con este artículo quiero hablar un poco sobre una de las vulnerabilidades de seguridad, que es común encontrar en las aplicaciones web, o en aplicaciones en una intranet, y que además pueden estar presentes en los navegadores WEB, les estoy hablando del XSS, del inglés Cross-site scripting el cuál es un tipo de agujero informático basado en la explotación de una vulnerabilidad del sistema de validación del HTML.

Brevemente resumiré lo que es el XSS, bueno como lo dije en el parrafó anterior es la abreviatura de "cross site scripting" para no ser confundido con CSS (hoja de estilo de cascada), abarca cualquier ataque que permita ejecutar código de "scripting", como VBScript, JavaScript o PHP, en otro sitio web.

Tipos de XSS


Directa (Persistente): consiste en invadir código HTML peligroso en sitios que así lo permitan, incluyendo así etiquetas como < script >,< iframe > , entre otras.

Indirecta(Reflejada): consiste en modificar valores que la aplicación web utiliza para pasar variables entre dos páginas, sucede cuando hay un mensaje o una ruta en la URL del navegador, en una cookie, o cualquier otra cabecera HTPP.

 

Medidas de Seguridad


A continuación se citaran las medidas básicas y generales que todo desarrollador, debe de implementar en sus aplicaciones web para disminuir el riesgo de un ataque XSS, cabe destacar que cada desarrollo web, tendrá un ambiente específico y en base a esto es necesario analizar, cual es la mejor táctica para evitar un ataque de este tipo.

 

1. Limitar el tamaño de los objetos HTML usados, por ejemplo si utilizamos un input test, que servirá para obtener los apellidos de un cliente, es importante darle un límite de caracteres.

input id="apellidos" maxlength="60" name="apellidos" type="text"

2. Quitar la opción de autocomplete en los campos utlizados para ingresar contraseñas.

input id="clave" maxlength="60" name="clave" type="password"

3. Nunca imprimir directamente el valor de las variables procedentes del usuario, ejemplo las variables del GET, o del POST.

input id="text" name="text" type="text" value="$_POST['text']" 

4. Definir claramente, que vamos a aceptar en cada una de las entradas, hablamos de enteros, flotantes, correo electrónico, cadena de caracteres y en esta última que es de las más delicadas definir que caracteres son permitidos, es ideal evitar caracteres como < >, pero es muy propio de cada aplicación por eso es importante analizarlo y tener claro que es lo que vamos a aceptar.

 

Validaciones en PHP.


A continuación les presento unas series de funciones para validar las entradas de nuestras aplicaciones dependiendo del tipo, longitud de campo ingresado que como comentamos en la sección anterior en el punto 4 debe ser analizado con detalle, en el momento de la implementación.

Valores Enteros, retornamos el valor entero, en caso contrario se retorna el valor default.

function getVarInt($param, $default = 0){
if (isset($param)) { // chequeamos que la variable no este vacia
return (int)$param; // retornamos el valor entero de la variable
}else
return $default;
// retornamos el valor default en caso que la variable sea null
}

Alfabetico con espacios en blanco, ejemplo: Nombre Apellido1 Apellido2

function getVarAlphaSpace($param, $max = -1, $default = NULL){
if (isset($param)){ // chequeamos que la variable no este vacia
//expresión regular, que inicie con una letra mayúscula o
minúscula que incluya espacios y termine con una letra.
preg_match("/^[A-Za-z]([A-Za-z\s]*[A-Za-z])*$/",$param,$arr);
if (!empty($arr)) return ($max>0) ? substr($arr[0],0,$max) : $arr[0];
//retornamos el valor alfabetico del tamale deseado.
}
return $default;
// retornamos default si el valor no es alfabetico con espacios
}

 


La idea es dar una idea con estas dos funciones de como validar nuestras entradas, lo importante que definir como lo dijimos antes el tipo, y en caso de encontrar algún problemas retornar un valor default, ya sea NULL, blancos, o cualquier otra cosa distinta a la entrada problemática, para evitar con en nuestra interfaz se imprima código no deseado. Es importante tomar en cuenta también en nuestras funciones de validación los tipos, correo, alfanuméricos, flotantes, los campos que permiten caracteres especiales como -, _, etc , es solo seguir la misma estructura de las funciones que dimos de ejemplo y cambiar la expresión regular.

 

Y recordar que lo mas importante, es tener muy claro que necesitamos y nunca confiar en datos que vengan directos del usuario, a nuestra aplicación, un poco de paciencia con las funciones para validar, y ojalá contar con alguna herramienta para probar que tan vulnerable puede ser nuestra aplicación y en caso de detectar un problema, repararlo lo mas pronto posible y tomar nota para no volver a caer en el.

[ Regresar ]