Para ser sincero, creo que el autor de estas funciones no tiene ni idea de qué son las inyecciones XSS y SQL o qué función cumplen exactamente.
sólo para nombrar dos singularidades:
Además: En general, las funciones que protegen contra XSS no son adecuadas para proteger contra las inyecciones de SQL y viceversa. Porque cada idioma y contexto tiene sus propios caracteres especiales que deben ser atendidos.
Mi consejo es saber por qué y cómo es posible la inyección de código y cómo protegerse de él. Aprenda los idiomas con los que está trabajando, especialmente los personajes especiales y cómo escapar de estos.
Editar He aquí algunos ejemplos (probablemente raro): Imagínese que usted permite que sus usuarios para introducir un valor que debe ser utilizado como un segmento de trazado en un URI que se utiliza en algún código JavaScript en un valor onclick
atributo . Por lo que el contexto de lenguaje se parece a esto:
- valor del atributo HTML cadena
Y para que sea más divertido : Está almacenando este valor de entrada en anuncios atabase.
Ahora, para almacenar este valor de entrada correctamente en su base de datos, solo necesita utilizar una codificación adecuada para el contexto en el que va a insertar ese valor en el lenguaje de la 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) los caracteres "
, '
y \
que deben escaparse. Pero como ya se dijo, las declaraciones preparadas hacen todo eso para usted, entonces úselas.
Ahora que tiene el valor en su base de datos, queremos imprimirlos correctamente. Aquí partimos de la más interior al contexto más externa y aplicar la codificación adecuada en cada contexto:
- Para el URI segmento de trazado contexto tenemos que escapar (al menos) todos esos personajes que vamos a cambiar ese contexto ; en este caso
/
(deje el segmento de ruta actual), ?
y #
(ambos dejan el contexto de ruta de URI). Podemos usar rawurlencode
para esto.
- Para cadena de JavaScript contexto tenemos que ocuparnos de
"
, '
y \
. Podemos usar json_encode
para esto (si está disponible).
- Para el valor del atributo HTML tenemos que cuidar de
&
, "
, '
y <
. Podemos usar htmlspecialchars
para esto.
Ahora todo junto:
'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'
Ahora bien, si es $row['user-input']
"bar/baz"
la salida es:
… onclick="window.open("http://example.com/"%22bar%2Fbaz%22"")" …
Pero el uso de 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 el llamado porcentaje de codificación, 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.
¿De qué libro es esto? – Gumbo
Aprendiendo PHP MySQL y Javascript – jpjp
@jpjp: ... y pensé que O'Reilly es solo para autores sofisticados. – Gumbo