¿Qué caracteres Unicode (control) debe aceptar (no) una aplicación web?

3

ESTO NO ES SOBRE XSS

Amenaza: Mallory ingresa caracteres de control en el campo de texto de una aplicación web pública que otros usuarios podrían usar en un programa de terminal (a través de copiar + pegar o ejecutando un script).

Otra amenaza es que un usuario ingrese a un dominio de phishing (que se muestra más adelante) y use un carácter de control RTL para que parezca no phishy.

http://www.‮moc.lapyap

es en realidad http://www.\u202Emoc.lapyap

(Otra razón menor es que Postgres barfs si un usuario ingresa el carácter nulo).

No estoy hablando de una inyección XSS regular que ejecute javascript. Estoy usando JSoup para evitar XSS y funciona bien, pero no bloquea los caracteres de control (a menos que se produzca un XSS)

Miré el validador ESWI de OWASP pero solo valida los caracteres ASCII (por ejemplo, en el método getValidPrintable ()).

Parece que no hay una buena razón para aceptar:

\ u0000 - \ u001F (excepto retorno de carro, avance de línea, pestaña horizontal)
\ u007F - \ u009F
\ u202E

¿Con qué otras personas debería preocuparme?

El escape / codificación en guardar es tan incorrecto como lo es con XSS.

    
pregunta Neil McGuigan 08.04.2015 - 00:07
fuente

2 respuestas

2

Va a ser muy difícil hacer una lista negra de todos los caracteres malos conocidos dependiendo del sistema entrante, el procesamiento, los cambios de formato (HTML, XML, JSON, etc. / ASCII, ebcdic, etc.). Si bien es probable que haya algunos casos en los que necesite campos de entrada verdaderamente "abiertos", sería mejor definir los caracteres permitidos / incluidos en la lista blanca por campo de entrada.

Por ejemplo, si usted solicita un nombre en inglés / romanizado solo acepta azAZ_ o algo similar. Si está lidiando con problemas multilingües, en la mayoría de los casos solo debería esperar un idioma a la vez y podría hacer que el usuario elija un idioma de entrada y luego filtre los caracteres requeridos en ese idioma en el contexto dado.

Al mirar las reglas de negocios para la mayoría de las aplicaciones, debe haber algunos casos en los que necesite permitir conjuntos completos y 10 idiomas al mismo tiempo. Permitir una entrada completa puede no ser el mejor equilibrio de funciones con seguridad según sus necesidades.

Por supuesto, todavía hay casos como las aplicaciones de chat en general y los foros, por lo que sigue siendo una pregunta válida tener ciertas listas negras conocidas o combinaciones incorrectas. No tengo conocimiento de una lista maestra, por lo que dejaré eso para otra respuesta. Los caracteres de control son lo primero que viene a la mente que tienen poco uso para la mayoría de los usuarios finales.

Las siguientes lecturas pueden ser útiles:

Me imagino que algunas soluciones dependerán de los diferentes sistemas y aplicaciones en su proceso de procesamiento y de lo que admitan, y de cómo se conviertan los datos, puede que no haya una respuesta o enfoque común que sea aplicable a nivel mundial.

    
respondido por el Eric G 08.04.2015 - 03:29
fuente
2

Acepte todos, simplemente codifíquelos en un formato seguro al recibirlos. Además, si está haciendo esta pregunta, primero consultaría una biblioteca de codificación para una implementación básica antes de continuar. La codificación puede ser más complicada de lo que piensa, y veo que las implementaciones personalizadas fallan todo el tiempo.

En muchos casos, no es el personaje en sí lo que es problemático, sino cómo encaja en un grupo de personajes.

Por lo tanto, me abstendré de darte una lista, ya que será extensa, y no te guiaré al éxito. Si esto es para producción, use una base de código revisada por pares para hacer su filtrado y codificación. Si esto es con el propósito de escribir una biblioteca, estudie una de esas bases de código revisadas por pares.

Solo para ser claros: En el camino, los datos deben ser desinfectados para evitar la inyección (asegúrese de usar y también consultas parametrizadas). En el camino de salida los datos deben estar codificados, para evitar XSS.

Los Web Frameworks más modernos tienen una clase de codificador decente. Si utiliza Java, consulte la implementación que OWASP proporciona: enlace

    
respondido por el baordog 08.04.2015 - 00:25
fuente

Lea otras preguntas en las etiquetas