cuándo escapar de la entrada del usuario

5

Me pregunto cuándo es la mejor manera de manejar las entradas de usuario que escapan.

Dos opciones vienen a mi mente

1) El usuario envía datos al servidor, lo evitamos y luego lo almacenamos en la base de datos 2) almacenamos los datos tal como están y los evitamos cuando enviamos datos al usuario.

A mí me parece mucho más fácil escapar y luego guardar los datos en la base de datos, pero supongamos que alguien encuentra flujo en nuestro sitio web y se las arregla para evitar el escape. Tenemos un problema de encontrar todos los datos que almacenamos en la base de datos sin escaparse

por otro lado, si solo almacenamos los datos tal como están, pero escapamos una vez que los enviamos al usuario, incluso si alguien encuentra flujo en nuestro sitio web, todo lo que tenemos que hacer es corregir un error ya que nuestro sistema ya asume que los datos se guardan en la base de datos en no escapado.

Aunque el segundo enfoque parece más fácil, parece mucho más propenso al error. Supongamos que generamos HTML en el servidor y lo enviamos al usuario y luego decidimos cambiar a solo enviar contenido al usuario a través de ajax, es fácil olvidar que debemos escapar de todos los datos antes de enviarlo al usuario o implementar una nueva API, o algo así. tercero.

Así que me pregunto, ¿cuál es la mejor manera de manejar esto?

    
pregunta D.L 10.03.2013 - 23:15
fuente

2 respuestas

11

La entrada del usuario es una cadena. Escape se realiza cuando desea insertar algunos caracteres en algún código HTML / SQL / Lo que insista en la interpretación de algunos caracteres en funcionalidades especiales. Por ejemplo, tienes un '<' y desea que se muestre al usuario como '<', pero si pega brutalmente la cadena dentro del HTML, entonces el navegador web del lado del cliente verá la '<' y piense que comienza alguna etiqueta HTML, en lugar de representar un simple '<'.

En general , desea mantener las cadenas como cadenas y delegar cualquier codificación o escape a funciones especializadas que lo hagan bien. Por ejemplo, para SQL, utiliza declaraciones preparadas . Con HTML de un contexto PHP, usaría htmlspecialchars() .

El punto a notar aquí es que el tipo de conversión, codificación o escape que necesita realizar depende de lo que esté tratando de hacer con la cadena. Si necesita la cadena para ponerla en algún HTML, entonces usará las entidades HTML (el &lt; para '<' y así sucesivamente). Si almacena en la base de datos la cadena ya escapada , está apostando a que usará la cadena solo al incluirla en algún HTML.

Por lo tanto, debe esforzarse por aplicar codificación / escape solo durante el uso. Es más flexible y simplifica la semántica. Dentro de su base de datos, almacene la cadena como una cadena.

    
respondido por el Tom Leek 10.03.2013 - 23:29
fuente
0

EDITAR: Luc ha señalado en el concepto que estoy demasiado inclinado hacia las soluciones de alto rendimiento. Si, en su situación, el rendimiento no es una preocupación, entonces es perfectamente aceptable (y preferible, de hecho) almacenar los datos originales solo y transformarlos en la salida. Esto le brinda flexibilidad para utilizar los datos como lo necesite sin necesidad de mantener versiones.

Respuesta original a continuación -------------------------------------------- ----------

Hasta cierto punto, depende. Primero, la respuesta rara vez es almacenar los datos sin procesar y escapar de ellos cuando los vuelve a leer.

Las dos soluciones comunes son:

1) Escape de los datos antes de almacenarlos.

2) Almacene dos copias de los datos, una escapada y una sin procesar.

En prácticamente cualquier sistema, la proporción de lecturas con respecto a escrituras va a estar muy inclinada hacia las lecturas. Puede ser 10: 1, pero podría ser 10,000: 1. Esta es la razón por la que desea almacenar los datos en un formato de escape y analizarlos solo cuando los está escribiendo, no cada vez que quiera leerlos.

El beneficio de almacenar ambos formatos es que el autor original puede modificar el contenido según lo previsto, puede volver a procesarlo si lo desea, puede revisar los datos originales ... Le brinda cierta flexibilidad adicional a costa de Un poco de complejidad adicional.

Esto es obviamente un poco simplista, ya que, por ejemplo, no estoy considerando los efectos del almacenamiento en caché en la proporción de lectura / escritura, pero espero que transmita el concepto general.

    
respondido por el Xander 10.03.2013 - 23:23
fuente

Lea otras preguntas en las etiquetas