it-swarm-es.com

¿Es suficiente filtrar los datos de entrada del usuario o debería analizarse?

En una aplicación web, podría haber dos enfoques para mitigar los ataques XSS:

  • todos los datos de entrada se pueden filtrar (eliminando todos los datos 'malos'), o
  • la entrada podría ser analizada, tokenizada y generada solo con las etiquetas permitidas, etc.

¿Qué método debería preferirse desde el punto de vista de la seguridad?

Con cualquier método, ¿cuáles son las trampas?

28
Peter Smit

Para la validación de entrada, recomiendo un enfoque de lista blanca combinado con pasar o rechazar. Así que defina lo que es válido y acepte solo entradas válidas, rechace todo lo demás.

Si crea un editor de texto enriquecido que envía html a su servidor, puede usar JavaScript para desinfectar la entrada, de modo que pegar html desde Word podría terminar funcionando. Sin embargo, su servidor no aceptará ninguna entrada no desinfectada.

Tratar de limpiar está sujeto a fallas, ya que eso suele ser mucho más complejo que simplemente averiguar si la entrada es válida o no.

La lista blanca es esencial para una buena seguridad. Siempre puede decidir aceptar más información, mientras mantiene el control. En un enfoque de lista negra, siempre tendrás que ponerte al día con el último truco.

Para obtener resultados, consulte otras respuestas.

18
Jörn Zaefferer

Estoy de acuerdo con el respuesta de @ Jorn sobre la validación.

Sin embargo, todavía estás olvidando un paso muy importante aquí, y es codificación de salida.
P.ej. Codificación HTML (o codificación de atributos, o codificación Javascript, etc.) antes de generar algo ... De hecho, esto es posiblemente incluso ¡más importante que la validación de entrada (posiblemente, no absolutamente, y definitivamente no en todas las situaciones ...)
En cualquier caso, no debería ser una u otra, definitivamente es tanto una validación de entrada estricta + codificación de salida.

Ahora, si se refiere a incluir etiquetas HTML "seguras" en la salida (entonces no está muy claro en su pregunta), entonces aún debe codificar ¡cada cosa, y luego decodificar las etiquetas específicas. está buscando sin ninguno de los atributos de la etiqueta .

PD. Si se refiere a una aplicación .NET, AntiXSS de MS (en WPL) proporciona un .GetSafeHTMLXXX conjunto de métodos.

19
AviD

su pregunta "Datos de entrada del usuario, ¿el filtrado es suficiente o debería analizarse?" es más general que el caso XSS. Supongo que querías ser específico para XSS, pero generalmente la entrada del usuario puede causar muchas vulnerabilidades adicionales como SQL Injection, Path Traversal, XSS ... A medida que tu pregunta se vuelve más específica sobre XSS, me referiría a lo que ya se dijo y buscaré filtrado de entrada y codificación de salida (¡siempre del lado del servidor!) con algunas contramedidas conocidas como las proporcionadas por OWASP .

Aún así, me gustaría señalarle que la mejor manera de resolver la inyección de SQL que puede ser causada por la entrada sin marcar es en consultas parametrizadas ( Hoja de trucos de prevención de inyección de SQL ) entonces si considera las vulnerabilidades de recorrido de ruta , mi enfoque sería un enfoque de lista blanca.

5
Phoenician-Eagle

La pregunta es demasiado amplia. La mejor respuesta es: depende. Depende del formato de los datos del usuario y de la política de seguridad que esté aplicando.

  • Por ejemplo, si incluye datos de usuario en una consulta SQL, la mejor respuesta es utilizar declaraciones preparadas.

  • Por ejemplo, si incluye datos de usuario, por ejemplo, su nombre completo, en una página HTML, la mejor respuesta puede ser utilizar la codificación de salida.

  • Por ejemplo, si está creando un servicio de correo web que permite a las personas enviar correos electrónicos HTML y desea mostrar un correo electrónico HTML al usuario, pero solo si el correo electrónico no contiene ningún contenido activo, entonces la mejor respuesta será analizar y filtrar el contenido analizado.

La mejor respuesta depende del dominio. Para obtener una respuesta más útil, necesitará proporcionar más detalles sobre el problema concreto que está tratando de resolver.

2
D.W.

Recomiendo encarecidamente no reinventar la rueda. Claro, todo desarrollador web debe conocer los conceptos básicos de seguridad, pero si tiene la posibilidad de usar una solución sólida, úsela. Hay muchas posibilidades de que durante la implementación de su propio filtro se pierda algo. La validación de entrada adecuada no se trata solo de eliminar caracteres incorrectos, este es un tema complejo. De todos modos, si no tiene otra opción, mire cómo funcionan otros WAF. Uno bien conocido y robusto para aplicaciones PHP es http://php-ids.org/ . Y en cuanto a los vectores de ataque, solo para recordar cuán "difusos" son - http://heideri.ch/jso/ .

1
anonymous