Hoy, acabo de encontrar en un foro la siguiente porción de código, que según su autor protege de ataques SQL Injection y XSS:
function limpiar_sql($value){
$value = trim(htmlentities($value)); // Evita introducción código HTML
if (get_magic_quotes_gpc()) $value = stripslashes($value);
$value = mysql_real_escape_string($value);
return $value;
}
El problema con este tipo de funciones es que dan una falsa sensación de seguridad si éstas no son aplicadas en el lugar correcto, por ejemplo si intentamos usar esa función para el siguiente ejemplo:
// Guardar el valor...
// Mostrar la url
echo '<a href="' . $url . '">enlace</a>";
Veremos que la porción de código mostrada es vulnerable a XSS si el valor de url
contiene algo como javascript:alert(document.cookie)
.
Si recordamos una entrada anterior, el bug en asp.net que permite realizar ataques XSS tiene un problema similar (uso de HttpUtility.HtmlEncode en lugar de HttpUtility.UrlEncode).
Como reflexión final, si queremos hacer uso de este tipo de funciones para validar/filtrar todos nuestros datos, debemos saber realmente que estamos haciendo.