¿Cómo puedo evitar el XSS reflejado en mis servicios web JSON?

10

Tengo un servicio web que toma datos POST (JSON) y devuelve parte del objeto de solicitud en la respuesta JSON.

Esto está abierto a XSS si la respuesta es representada como HTML por el navegador, ya que alguien podría agregar HTML arbitrario al objeto de solicitud.

¿Cuál es la forma estándar de mitigar esto? Las opciones actuales que se me ocurren son:

  • Permitir solo las solicitudes con el encabezado X-Requested-With: XMLHttpRequest para detener los ataques que se basan en solicitudes que no son ajax para mi servicio
  • Envíe la respuesta con el tipo de contenido application/json y espere que el navegador se niegue a mostrar esto como HTML
  • Codifique los caracteres no seguros en la respuesta (¿cómo hago esto? ¿utilizando \ uxxxx?)

No he podido encontrar una referencia concreta sobre esto.

    
pregunta Flash 20.09.2012 - 04:25
fuente

3 respuestas

4
  

Codifique los caracteres no seguros en la respuesta (¿cómo hago esto? ¿utilizando \ uxxxx?)

Sí. < a \u003C en particular.

Puede que ya haya una opción en su codificador JSON para hacer esto (por ejemplo, en PHP, JSON_HEX_TAG ); de lo contrario, es un trabajo simple hacer una cadena de reemplazo después de la codificación. (Esto es seguro ya que no hay un lugar donde se pueda usar legalmente < en JSON que no sea en una cadena literal). En este punto, también puede incluir el elemento principal para evitar la inclusión del script de origen cruzado.

Lo enviaría como application/json como una cuestión de corrección, pero no confiaría en que todos los navegadores antiguos lo respeten necesariamente. Confiar en el encabezado X-Requested-With es generalmente problemático, ya que no funciona bien con el almacenamiento en caché, aunque puede que no sea una preocupación para usted.

    
respondido por el bobince 20.09.2012 - 11:07
fuente
4

Los siguientes puntos deben tenerse en cuenta

  • La vulnerabilidad potencial de XSS se puede evitar usando el correcto Tipo de contenido. Todas las respuestas JSON deben usar el application/json tipo.

  • El encabezado nosniff se usa para deshabilitar la detección de contenido en versiones antiguas de Internet Explorer.

  • Siempre haga que la primitiva externa sea un objeto para cadenas JSON:

explotable:

[{"object": "inside an array"}]

No explotable:

{"object": "not inside an array"}

También no explotable:

{"result": [{"object": "inside an array"}]}
    
respondido por el Mohammed Farhan 14.11.2017 - 16:17
fuente
2

Establezca Content-Type en application / json, y configure X-Content-Type-Options: nosniff (el último encabezado le indica al navegador que use el tipo de contenido dado, sin adivinar más). Incluso podría considerar agregar un encabezado adjunto contenido-Disposición:. Esto será ignorado por las solicitudes de XHR, pero hará que el cuadro de diálogo de descarga se abra si un atacante intenta engañar a un usuario para que lo abra directamente en el navegador.

También puede consultar: enlace y enlace

    
respondido por el Erlend 21.09.2012 - 07:51
fuente

Lea otras preguntas en las etiquetas