Medidas Anti-XSS del lado del cliente

4

¿Cuáles son las bibliotecas de JavaScript del lado del cliente fiables y estables para la prevención XSS y por qué? Sería muy beneficioso si pudiera proporcionar detalles como:

  • soporte de navegador
  • conformidad con cualquier estándar (como las directrices de OWASP)
  • su enfoque (por ejemplo, escapes mínimos, listas / listas blancas)
  • todas las pruebas que pasaron (¿existen pruebas XSS estándar de la industria?)
  • se mantiene activamente para las amenazas recientemente descubiertas

Puedes agregar más elementos a la lista.

    
pregunta John L. 10.08.2016 - 19:19
fuente

4 respuestas

3

En primer lugar, XSS es un problema de salida, que casi siempre afecta a la salida del servidor y, por lo tanto, está parcheado en el servidor. XSS permite que un atacante inyecte JavaScript, que se utiliza para secuestrar el navegador y realizar cualquier acción como víctima.

La única mitigación XSS del lado del cliente viable es tener una política de seguridad de contenido (CSP) que no permite inyecciones en línea. El CSP es un conjunto de reglas definidas por el servidor que se aplican por el navegador y se utiliza para limitar la ejecución de JavaScript. El CSP es una herramienta nueva y muy poderosa para apagar XSS.

"Otro enfoque común para la mitigación de XSS del lado del cliente es usar Plantillas AngularJS . Un lenguaje de plantilla seguro como AngularJS mitigará XSS al neutralizar el código ejecutable que estaba destinado a mostrarse como texto. Este es un gran enfoque para desarrollar aplicaciones seguras. Sin embargo, una aplicación que utiliza AngularJS no puede protegerse contra las llamadas de API que son vulnerables a XSS, solo el CSP puede hacer eso.

AngularJS + CSP hará que una aplicación sea muy difícil de explotar con XSS, pero nada es del 100%. Todavía existe la posibilidad de XSS basado en DOM y Ataques de sitios cruzados en Flash , que son muy similares entre sí. No hay una mitigación general aquí, ni siquiera un Servidor de seguridad de aplicación web (WAF) puede detener estos ataques, son perfect y extendido .

    
respondido por el rook 10.08.2016 - 19:32
fuente
1

Como lo menciona la respuesta de @Rook, la única forma en que JS puede protegerse contra XSS es cuando se usa un marco (como Angular) que recupera todo el contenido dinámico de la página a través de JS (generalmente usando XmlHttpRequest ) y luego lo inyecta de forma segura en la página. Como @GeorgeMauer señala, usted (o su marco) puede realizar este paso de inyección en la página de forma segura utilizando la propiedad textContent / innerText de un elemento DOM, pero luego pierde la capacidad de especificar cualquier tipo de Formato dinámico en absoluto. A veces esto está bien, a veces no.

El script del lado del cliente nunca puede proteger contra las inyecciones de XSS que van al servidor. Como sugiere su nombre, XSS a menudo se inyecta en todos los sitios, por lo que el código del lado del cliente no puede detectar la inyección porque ni siquiera está sucediendo en su sitio (y, por lo tanto, el código del lado del cliente no se está ejecutando). El XSS almacenado a menudo se inyecta desde el sitio de destino, pero de nuevo, la validación del lado del cliente no ayudará; el atacante puede (y lo hará) deshabilitar la validación (controlan al cliente; controlan el código del lado del cliente que se ejecuta en él) o simplemente crea la solicitud HTTP maliciosa (POST o lo que sea) a la medida usando una herramienta como curl o Burp Suite .

Del mismo modo, el código del lado del cliente no puede proteger contra el contenido HTML / JS malintencionado devuelto por el servidor web en respuesta a una solicitud de página. Para cuando se están ejecutando las verificaciones de desinfección (o lo que sea), también lo es el código malicioso; ¡es demasiado tarde! Tiene que hacer toda su validación / escape / lo que sea antes de que el código llegue al motor de renderizado / JS. Solo hay dos formas de hacerlo: ejecutarlo en el lado del cliente en cadenas JS que luego agregará al contenido de la página (así es como funcionan Angular y sus amigos, pero no son infalibles) o hacerlo en el servidor .

  • ¿Escapar? ¡Gran idea, debes hacer que tu servidor haga eso!
  • lista negra? Una idea terrible, una pérdida de tiempo y una falsa sensación de seguridad.
  • ¿Lista blanca? Una buena técnica de validación de entrada; debe hacer que su servidor haga esto.
  • Si usted hace su lado del servidor de prevención XSS, entonces el navegador no sabe ni le importa. Todos los navegadores comprenden URL, HTML y escapes de JavaScript.
  • No hay "estándares" para la seguridad de XSS, como tampoco existen "estándares" para la seguridad de la memoria de código nativo.

Del mismo modo, no hay batería de pruebas que valga la pena el tiempo que tomó compilarlas. Puede lanzar cada escáner automatizado que desee a su código, pero si solo construyó sus protecciones al nivel necesario para vencer a esos escáneres, un atacante inteligente probablemente los omitirá. Lo hago todo el tiempo. Los escáneres solo tienen dos salidas: vulnerable y tal vez vulnerable . No pueden decirte que estás a salvo.

No vayas por una cobertura mínima. No trates de ser lindo y hacer todo lo posible por el lado del cliente; ¡incluso si está utilizando algo como Angular, funciona bajo el supuesto de que es vulnerable y realice la validación de entrada y la codificación de salida en el servidor! En lugar de intentar protegerse contra amenazas conocidas y espero que obtenga Protección actualizada contra las futuras, haga que su servidor solo devuelva el código que se garantiza que es seguro. Por supuesto, ejecute un escáner, pero también contrate a alguien que sepa lo que está haciendo para probarlo de verdad, si le preocupa la seguridad.

    
respondido por el CBHacking 11.08.2016 - 00:48
fuente
0

¿Qué tal si solo colocamos texto en el DOM configurando textContent en un DOM? elemento ?

Pros:

  • Evitará XSS el 100% del tiempo.
  • Compatibilidad con el navegador al 100% (las versiones anteriores de IE lo llaman innerText pero son lo suficientemente fáciles de copiar).
  • No se necesita ninguna biblioteca en absoluto.

Contras:

  • Tienes que hacer esto o usar un marco que lo haga.
  • No puede colocar ningún html en el texto, incluido el marcado en línea como <em> .

Como nota al margen, mencionaré que mucha gente piensa que esto significa que puedes crear un elemento, establecer textContent y luego tomar innerHTML para sanear el texto. Esto no es el caso .

    
respondido por el George Mauer 10.08.2016 - 19:50
fuente
0

Ayudaré indicando que no debe usar una biblioteca de administración de sesiones y una arquitectura que se basa en pasar datos confidenciales (como un ID de sesión) al cliente y almacenarlos en las cookies locales de almacenamiento o no httpOnly del HTML5, esto es la cita de OWASP :

  

Los datos almacenados en este objeto persistirán después de cerrar la ventana,   Es una mala idea almacenar datos confidenciales o identificadores de sesión en este   Objeto ya que estos pueden ser accedidos a través de JavaScript. ID de sesión almacenados en   las cookies pueden mitigar este riesgo utilizando la marca httpOnly.

El uso de cookies con la marca httpOnly evitará (en los navegadores que lo admiten) el riesgo de que cualquier script extraiga esos datos del almacenamiento local. Por supuesto, todavía hay otros riesgos, pero esto también ayudará.

    
respondido por el John ingmar 13.08.2016 - 10:42
fuente

Lea otras preguntas en las etiquetas