Expresiones regulares basadas en PERL (PCRE)

RECU-0610 (Recurso Experiencia)

Introducción

Se muestra un fragmento de código PHP en el que se va a comprobar que se recibe un número de 1 a 6 dígitos a partir de una comprobación basada en expresión regular.

Si se analiza el código, se observa que no se ha introducido la variable key como un número, sino que se ha concatenado un código binario nulo chr(0) y a continuación una porción de código JavaScript. El resultado esperado es que la expresión regular detectará el no cumplimiento del patrón y se mostrara el mensaje de error, sin embargo el resultado no es este.

El problema viene por el carácter nulo que se ha añadido tras el número, ya que la función ereg no es segura con material binario, se cumple la expresión regular, por lo que se muestra su contenido.

<?php

$key = "123456" . chr(0) . "<script>alert('XSS')</script>";
if(!ereg('^[0-9]{1,6}$', $key)){
   echo "ERROR: El valor proporcionado no es un número de 1 a 6 dígitos";
}
else{
   echo $key;
}

?>

Recomendaciones

 Ereg es vulnerable a las expresiones regulares permitiendo ataques del tipo XSS. Se recomienda utilizar expresiones regulares basadas en PERL (PCRE) que son más seguras respecto a este aspecto.

Contenidos relacionados