Este documento describe el formato JSON y cómo se puede usar para intercambiar datos entre una página web y un servidor. Explica que JSON se puede utilizar con Ajax para cargar datos mientras la página se está cargando y cómo se puede acceder a datos JSON directamente modificando la URL. También advierte sobre posibles vulnerabilidades de seguridad como inyección de código malicioso si no se validan e inspeccionan adecuadamente los datos de entrada del usuario.
2. JSON: Un formato ligero de
intercambio de datos basado en
nombre/valor:
{"parameter":"value","next_parameter":"next_value"}
Usando Ajax, podemos transmitir
datos JSON mientras la página Web
se esté cargando.
3. Y como Ajax utiliza HTTP podemos
accesar a los datos JSON
directamente en el explorador
modificando la URL
En la API de Twitter podemos
armar una URL que regresa en
formato JSON los datos de mi
Twitter:
https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen
_name=annikapringles&count=1&callback=callback
callback([{"created_at":"Sat Apr 21 15:15:51 +0000
2012","id":193719704974659584,"id_str":"193719704974659584","text":""vestida", para
matar","source":"u003ca href="http://twitter.com/#!/download/iphone"
rel="nofollow"u003eTwitter for
iPhoneu003c/au003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":nul
l,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id
":52305348,"id_str":"52305348","name":"Annika
Pringles","screen_name":"annikapringles","location":"Mexico City","description":"I'm an operation that
is executed in every 3d software, when a 4 sided vertical node dynamic is cross interpolated with a
particle dampening...
4. JSON está chido, pero cuando
necesitamos que regrese valores
que contengan HTML, ahí hay
problema!
Podemos intentar inyectando un
<s> en alguno de los datos del
request, y si vemos que el
explorador responde con texto y
una línea quiere decir que la
página es vulnerable al XSS
5. Como a los exploradores les encanta
renderear código a pesar de que le
indiques que el Content-Type sea
application/json o application/x-
javascript, puedes ser objetivo de que
alguien pueda ‘esnifear’ tu contenido y así
puedan ejecutar Javascripts chuecos
Internet Explorer confía ciegamente en la
extensión cuando se está ‘esnifeando’
contenido y las extensiones de los
archivos pueden ser cambiadas en
cualquier momento, esto es, si tenemos
usuario/json nos regresa texto plano, pero
si le cambiamos a usuario/json.html lo
puede interpretar como HTML!
Dependiendo el servidor web hay varias
formas de hacer este cambio de
extensiones:
/json.htm
/json.html
/json/.html (PHP and Asp.NET)
/json;.html (JSP)
/json.cgi?a.html
6. Verificando que se puedan agregar
extensiones arbitrarias en la URL
El sitio esté usando HTTPS
La página tenga ‘headers’ para
cache-control: no cache o pragma:
no-cache
El sitio tenga el ‘header’ content-
disposition: attachment
Que el Content-Type del sitio esté
puesto para image/[anything]
7. Como siempre, hay que validar
todos los input que haga el usuario
Cuando el input del usuario se
tenga que regresar al explorador,
siempre codificar ese texto
propiamente, p.ej.: reemplazar <
con Unicode como u003C
Y finalmente, como un extra,
incluir en el servidor web el header
X-Content-Type-Options: nosniff,
esto para evitar que ‘esnifeen’
contenido en Internet Explorer 8+
y otros exploradores