Prevención de ataques XSS en PHP.

Una forma de atacar a un sitio web en mediante los ataques conocidos como XSS cuyo nombre original es «Cross Site Scripting», pero renombrado XSS para evitar ser confundido con las hojas de estilo CSS. Básicamente consiste en explotar las vulnerabilidades de la validación HTML que posee un sitio. Para ser más claro, daré un ejemplo en el cual se podría dar un caso de este tipo de ataques. Y finalmente una función en PHP que nos saca este problema de encima.

Supongamos un sitio en el cual se publican fotos y los usuarios pueden dejar sus comentarios, ingresándolos en un formulario que se encuentra ahí mismo (un ejemplo tradicional de «fotolog») y luego se publican instantáneamente en el sitio cuando el usuario lo envía.

Si no atendemos la posibilidad de estos ataques, un usuario con algo de conocimiento en la materia podría ingresar un «comentario»  con el siguiente código:

<script>alert(‘Sitio atacado mediante XSS’)</script>

Si el usuario envía este comentario y en el sitio no es tratado, publicándose directamente, el resultado sería que toda persona que ingrese al sitio verá un cartel emergente que irrumpe en la pantalla con el mensaje indicado, muy lejos de lo que un desarrollador podría pretender. Este ejemplo pude resultar un tanto inofensivo, pero si se inserta un bucle o lazo que hiciera que se muestre indefinidamente el cartel, tendríamos un sitio inaccesible a su contenido resultando mucho más drástico el efecto del ataque.

En PHP para tratar la cadena de texto que el usuario envía, podemos utilizar la siguiente función que puede salvarnos de muchos dolores de cabeza:

string htmlspecialchars ( string cadena);

o también podemos utilizarla como:

string htmlspecialchars ( string cadena [, int quote_style [, string juego_caracteres]] );

A esta función le pasamos como parámetro una cadena de caracteres que puede contener caracteres especiales como «<«, «>», «\», etc. Y nos retorna otra cadena con los caracteres especiales en formato  HTML.

Actualmente, las traducciones realizadas son:

  • ‘&’ (ampersand) se convierte en ‘&’
  • ‘»‘ (doble comilla) se convierte en ‘»‘ cuando no se utiliza la constante ENT_NOQUOTES.
  • »’ (commilla simple) se convierte en »’ cuando se utiliza ENT_QUOTES.
  • ‘<‘ (menor que) se convierte en ‘<‘
  • ‘>’ (mayor que) se convierte en ‘>’

Según la descripción del manual de PHP:

«Esta función es útil para evitar que el texto introducido por el usuario contenga código HTML, como ocurre en aplicaciones de foros o libros de visita. El segundo parámetro quote_style indica a la función el modo en el que se tienen que tratar las comillas simples y las comillas dobles. El modo por defecto es ENT_COMPAT, que es el modo retrocompatible que solo traduce las comillas dobles y deja intactas las comillas simples. Si se indica el valor ENT_QUOTES, se traduce tanto las comillas simples como las dobles. Por último, si se indica el valor ENT_NOQUOTES, no se traducen ni las comillas simples ni las dobles.»

Continuando con el ejemplo del ataque, nosotros antes de publicar el comentario enviado por el usuario deberíamos procesar la cadena con la función y de esta forma el ataque quedaría sin efecto. Y en lugar de aparecer el cartel emergente, simplemente se mostrará el comentario tal cual fue enviado.

Espero que esta funcion les sea de utilidad.

7 comentarios en «Prevención de ataques XSS en PHP.»

  1. He mandado el texto alert(‘Sitio atacado mediante XSS’) para probar. Muchas gracias por la informacion.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.