Deja para tener una rápida revisión de por qué se necesita escape en diferentes contextos:
Si se encuentra en una cadena delimitada cita, tiene que ser capaz de escapar de las comillas. Si está en xml, necesita separar "contenido" de "marcado" Si está en SQL, debe separar "comandos" de "datos" Si se encuentra en la línea de comandos, debe separar "comandos" de "datos"
Este es un aspecto realmente básico de la informática en general. Debido a que la sintaxis que delimita los datos puede ocurrir EN LOS DATOS, debe haber una manera de diferenciar los DATOS de SYNTAX, por lo tanto, escapando.
En la programación web, los casos que escapan comunes son: 1. Salida de texto en HTML 2. Transferir los datos en atributos HTML 3. Salida de HTML en HTML 4. Insertar datos en Javascript 5. Insertando datos en SQL 6. Insertar datos en un comando de shell
Cada uno tiene implicaciones de seguridad diferentes si se manejan incorrectamente. ¡ESTO ES REALMENTE IMPORTANTE! Vamos a revisar esto en el contexto de PHP:
texto en HTML: htmlspecialchars (...)
de datos en HTML atributos htmlspecialchars (..., ENT_QUOTES)
HTML en HTML Utilice una biblioteca como HTMLPurifier para ASEGURAR que solo estén presentes las etiquetas válidas.
Datos en Javascript Prefiero json_encode
. Si lo está colocando en un atributo, aún necesita usar el # 2, como
Insertar datos en SQL Cada controlador tiene una función de escape() de algún tipo. Es lo mejor Si está ejecutando un juego de caracteres latin1 normal, addslashes (...) es adecuado. No olvide las citas ALREDEDOR de la llamada addslashes():
"INSERT INTO table1 SET field1 = '". addslashes ($ data)."'"
datos en la línea de comandos ( escapeshellarg) y escapeshellcmd() - Leer el manual
- tomar estos a corazón, y eliminará el 95% * de común riesgos de seguridad web! (* una conjetura)
¿Por qué el uso de 'ENT_QUOTES' (en lugar de' ENT_NOQUOTES' como lo sugerí)? –
Uso ENT_QUOTES para campos de entrada con datos de la base de datos. Entonces, si los datos tienen 'o' no se cerrará la variable de valor dentro de la etiqueta de entrada. –
Ólafur: sí, en los campos de entrada (o más en general atributos) tiene cierto sentido. ;-) –