Para ser honesto, creo que el autor de esta función no tiene idea de qué son las inyecciones XSS y SQL o qué hace exactamente la función utilizada.
Solo por nombrar dos rarezas:
- Utilizando
stripslashes
después demysql_real_escape_string
elimina las barras que fueron agregadas pormysql_real_escape_string
. htmlentities
reemplaza los caracteres<
y>
que se utilizan enstrip_tags
para identificar etiquetas.
Además:En general, las funciones que protegen contra XSS no son adecuadas para proteger contra inyecciones de SQL y viceversa. Porque cada idioma y contexto tiene sus propios caracteres especiales que deben cuidarse.
Mi consejo es aprender por qué y cómo es posible la inyección de código y cómo protegerse contra ella. Aprenda los idiomas con los que está trabajando, especialmente los caracteres especiales y cómo evitarlos.
Editar Aquí hay un ejemplo (probablemente extraño):imagina que permites que tus usuarios ingresen algún valor que debería usarse como un segmento de ruta en un URI que usas en algún código JavaScript en un onclick
valor de atributo. Así que el contexto del idioma se ve así:
- Valor de atributo HTML
- Cadena JavaScript
- Segmento de ruta URI
- Cadena JavaScript
Y para hacerlo más divertido:está almacenando este valor de entrada en una base de datos.
Ahora, para almacenar este valor de entrada correctamente en su base de datos, solo necesita usar una codificación adecuada para el contexto en el que está a punto de insertar ese valor en el idioma de su base de datos (es decir, SQL); el resto no importa (todavía). Dado que desea insertarlo en una declaración de cadena SQL, los caracteres especiales contextuales son los caracteres que le permiten cambiar ese contexto. En cuanto a las declaraciones de cadenas, estos caracteres son (especialmente) el "
, '
y \
caracteres que necesitan ser escapados. Pero como ya se indicó, las declaraciones preparadas hacen todo ese trabajo por usted, así que utilícelas.
Ahora que tiene el valor en su base de datos, queremos generarlos correctamente. Aquí procedemos del contexto más interno al más externo y aplicamos la codificación adecuada en cada contexto:
- Para el segmento de ruta URI context necesitamos escapar (al menos) de todos aquellos caracteres que nos permitan cambiar ese contexto; en este caso
/
(dejar el segmento de ruta actual),?
y#
(ambos dejan el contexto de la ruta URI). Podemos usarrawurlencode
por esto. - Para la cadena JavaScript contexto que debemos cuidar de
"
,'
y\
. Podemos usarjson_encode
para esto (si está disponible). - Para el valor del atributo HTML tenemos que cuidar de
&
,"
,'
y<
. Podemos usarhtmlspecialchars
por esto.
Ahora todo junto:
'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'
Ahora si $row['user-input']
es "bar/baz"
la salida es:
… onclick="window.open("http://example.com/"%22bar%2Fbaz%22"")" …
Pero usar todas estas funciones en estos contextos no es una exageración. Porque aunque los contextos pueden tener caracteres especiales similares, tienen diferentes secuencias de escape. URI tiene la llamada codificación porcentual, JavaScript tiene secuencias de escape como \"
y HTML tiene referencias de caracteres como "
. Y no usar solo una de estas funciones permitirá romper el contexto.