2009-08-13 12 views
17

Mientras me preparo para abordar el problema del filtrado de datos de entrada y la desinfección, tengo curiosidad por saber si hay una mejor (o la más utilizada) práctica. ¿Es mejor filtrar/desinfectar los datos (de HTML, JavaScript, etc.) antes de insertar los datos en la base de datos, o debería hacerse cuando los datos se preparan para mostrarlos en HTML?Cuándo filtrar/desinfectar datos: antes de la inserción de la base de datos o antes de la visualización?

Unas pocas notas:

  • que esté haciendo esto en PHP, pero sospecho que la respuesta a esto es el lenguaje agnóstico. Pero si tiene alguna recomendación específica para PHP, ¡por favor comparta!
  • Esto no es un problema de escape de los datos para la inserción de la base de datos. Ya tengo PDO manejando eso bastante bien.

Gracias!

+0

Véase mi respuesta a: http://stackoverflow.com/questions/129677/whats-the-best-method-for-sanitizing-user-input-with-php/130323#130323 – troelskn

Respuesta

17

Cuando se trata de mostrar los datos enviados por el usuario, el mantra generalmente aceptado es "Entrada de filtro, salida de escape".

recomendaría contra escapar cosas como entidades html, etc, antes de entrar en la base de datos, porque nunca se sabe cuando HTML no será su medio de visualización. Además, los diferentes tipos de situaciones requieren diferentes tipos de salida de salida. Por ejemplo, incrustar una cadena en Javascript requiere escapes diferentes que en HTML. Hacer esto antes puede arrullar en una falsa sensación de seguridad.

Por lo tanto, la regla básica es higienizar antes de usar y específicamente para ese uso; no preventivamente

(por favor, yo no estoy hablando de escape de salida para SQL, apenas para la exhibición. Por favor, todavía no escapar de datos con destino a una cadena SQL).

+0

1 Excelente punta en general, especialmente el "recomendaría no escapar cosas como entidades html, etc., antes de ir a la base de datos, porque nunca se sabe cuando el HTML no será su medio de visualización" – Jeach

8

me gusta tener/almacenar los datos en el formulario original. solo escapo/filtro los datos dependiendo de la ubicación donde lo estoy usando.

  • en una página web - codificar toda html
  • en SQL - matar cotizaciones
  • en url - URLEncoding
  • en impresoras - escape de codificar los comandos
  • en lo que siempre - codificarla para ese trabajo
6

Desinféctelo para la base de datos antes de ponerlo en la base de datos, si es necesario (es decir, si no está utilizando una capa de interactividad de base de datos que maneja eso para usted) Desinfecte para mostrar antes de mostrar.

Almacenar elementos en una forma citada actualmente innecesaria solo causa demasiados problemas.

6

Hay al menos dos tipos de filtrado/desinfección que deben preocuparse por:

  • SQL
  • HTML

Obviamente, la primera de ellas tiene que tener cuidado de antes/cuando insertando los datos en la base de datos, para evitar inyecciones de SQL.
Pero ya lo sabes, como dijiste, así que no hablaré más de eso.


El segundo, por el contrario, es una pregunta más interesante:

  • si los usuarios deben ser capaces de editar sus datos, es interesante para volver a ellos de la misma manera que lo ingresé al principio; lo que significa que debe almacenar una versión "non-html-specialchars-escaped".
  • si quieren tener alguna muestra HTML, tal vez vamos a usar algo así como HTMLPurifier: muy potente ... Pero puede ser que requiera un poco demasiado recursos si está ejecutando en todos los datos cuando tiene que ser visualizado .. .

Así:

  • Si desea mostrar algo de HTML, usando una herramienta pesada para validar/filtrarla, diría que necesita para almacenar una cualquiera de sus versiones ya filtrada/en la base de datos , para no destruir el servidor, volver a crearlo cada vez que se muestren los datos
    • , pero también es necesario para almacenar el "original" versión (ver lo que he dicho antes)
    • En ese caso, probablemente almacenar ambas versiones en la base de datos, incluso si se lleva a cabo más ... O al menos use algún buen mecanismo de almacenamiento en caché, para no recrear la versión limpia una y otra vez.
  • Si no desea mostrar ningún tipo de HTML, que va a utilizar htmlspecialchars o un equivalente, lo que probablemente no es que gran parte de una CPU-comedor ... por lo que probablemente no importa mucho
    • que todavía tienen que almacenar el "original" versión
    • pero se escape cuando se está outputing los datos podrían estar bien.

Por cierto, la primera solución también es bueno si los usuarios están usando algo así como BBCode/rebajas/wiki cuando se introducen los datos, y se renderiza en HTML ...
Al menos, como siempre y cuando se muestre con más frecuencia de lo que se actualiza, y especialmente si no utiliza ningún caché para almacenar la versión limpia de HTML.

+0

(Re: desinfección del HTML específicamente) 8 años después, ahora que la representación del cliente es tan común que el punto "Yo diría que necesitas almacenar una versión ya filtrada/cualquier versión en la base de datos, para no destruir el servidor" ahora es aún más relevante. Desinfectar HTML es una operación costosa, y en muchos casos tendrá más sentido desinfectar al guardar en lugar de mostrarse. Aquí hay compensaciones obvias en términos de que la operación es con pérdida y se requiere una migración de datos para actualizar las reglas de desinfección, pero hay muchos casos en los que las compensaciones valen la pena. –

3

Sobre todo depende de lo que está planeando hacer con la entrada, así como su entorno de desarrollo.

En la mayoría de los casos, usted desea la entrada original. De esta forma, obtendrá el poder de ajustar su producción al contenido de su corazón sin temor a perder el original. Esto también le permite solucionar problemas como salida interrumpida. Siempre puede ver cómo sus filtros son defectuosos o la entrada del cliente es errónea.

Por otro lado, algunos datos semánticos cortos podrían ser filtrados inmediatamente. 1) No quiere números de teléfono desordenados en la base de datos, por lo que para estas cosas podría ser bueno desinfectar. 2) No quiere que otro programador genere accidentalmente datos sin escaparse, y trabaja en un entorno multiprogramador. Sin embargo, para la mayoría de los casos, los datos brutos son mejores IMO.

5

Siempre dicen cosas escapar inmediatamente antes de pasarlos al lugar que necesitan ser escapado. A su base de datos no le importa el HTML, por lo que es innecesario escaparse de HTML antes de almacenarlo en la base de datos.Si alguna vez desea producir como algo diferente a HTML, o cambiar qué etiquetas están permitidas/no permitidas, es posible que tenga un poco de trabajo por delante. Además, es más fácil recordar hacer el derecho de escape cuando es necesario hacerlo, que en una etapa mucho más temprana del proceso.

También vale la pena señalar que las cadenas escapadas de HTML pueden ser mucho más largas que la entrada original. Si pongo un nombre de usuario japonés en un formulario de registro, la cadena original puede contener solo 4 caracteres Unicode, pero el escapado de HTML puede convertirlo en una cadena larga de "& # 12345; & # 67890; & # 18504; & # 31337;" . Entonces mi nombre de usuario de 4 caracteres es demasiado largo para su campo de base de datos y se almacena como dos caracteres japoneses más medio código de escape, lo que probablemente también me impida iniciar sesión.

Tenga cuidado con los navegadores que tienden a escapar de cosas como no -Inglés el texto en los formularios enviados por ellos mismos, y siempre habrá ese listillo que usa un nombre de usuario japonés en todas partes. Así que es posible que desee realmente unescape HTML antes de almacenar.

Cuestiones relacionadas