Filtrando XSS en .Net, PHP y J2EE (Parte II de II)

Buenas a todos, hoy continuaremos con la cadena de artículos sobre XSS, analizando como proteger estas vulnerabilidades en los lenguajes J2EE, PHP y .Net:

J2EE

  • En J2EE podremos utilizar mecanismos de salida de Struts.

A continuación se muestra un ejemplo básico que utiliza páginas dinámicas JSP. Cuando se accede a la página, esta muestra el pais del usuario. Para ello, recupera sus datos en el objeto “User”.

<bean:write name="User" property="Country"/>

¿Qué ganamos con ello? básicamente que todos los datos que se escriban del país serán interpretados como texto (nunca como contenido activo)

  • Otra alternativa es utilizar las librerías JSTL, en concreto la librería Core. Mediante dicha librería, con el atributo escapeXML=”true”, se le indica al navegador que interprete la cadena como texto (nunca como HTML):
<c:out value="<p>Hi world!</p>" escapeXml="true" />

 

.NET

  • Una de las mejores alternativas en .Net es hacer uso de la librería de Microsoft Anti-XSS, que podéis descargar gratuitamente desde aquí.

Supongamos que el siguiente ejemplo mostrase un mensaje de bienvenida obteniendo el nombre de un usuario la URL. Este ejemplo sería vulnerable a XSS:

http://www.antiXSS.com/index.aspx?name=Perico

Para evitarlo en .Net utilizaríamos el siguiente código:

<HTML>Hola, <%=AntiXss.HtmlEncode(Request.QueryString["name"])%></HTML>

PHP

  • En PHP podremos hacer uso de las funciones htmlentities() o htmlspecialchars()

A continuación se muestra un ejemplo de una aplicación web con un formulario que tiene un campo donde el usuario introduce su nombre, este campo utiliza funciones de filtrado para evitar ataques XSS:

$clean=array();$_POST['usuario']; //  Lee la cadena introducida por el usuario$clean['usuario'] = htmlentities($_POST['usuario'], ENT_QUOTES);
  • Otra opción es hacer uso de la función preg_match() para aceptar únicamente valores de entrada que coincidan con un patrón especificado. A continuación se muestra un patrón que sólo permite caracteres del rango de la a-z.
If (preg_match("^[a-z]+$/i",$_GET['nombre'])){$clean['user_login'] = $_GET['nombre'];}
 Eso es todo por hoy,Saludos!