datatype jsonp same-origin-policy cross-site

datatype - ¿Por qué JSONP entre dominios es seguro, pero JSONP entre dominios no?



jsonp php (2)

Entiendo que esta pregunta es sobre por qué el navegador considera JSONP seguro, no sobre si es seguro (lo cual no es). Voy a abordar esta pregunta paso a paso.

Regular AJAX

Para realizar una solicitud regular de AJAX, el navegador crea un objeto XHR , lo apunta a la URL y extrae los datos. El objeto XHR solo confiará en los datos del mismo dominio. Esta es una limitación difícil. No hay forma de evitarlo en los navegadores actuales (edición: ahora puede usar CORS).

Solución - No utilice XHR

Como XHR está sujeto a la misma política de dominio, no podemos usar XHR para hacer AJAX de dominio cruzado . Por suerte, hay otras formas de golpear un servidor remoto. Podríamos añadir una etiqueta de imagen a la página, por ejemplo. También podemos agregar una etiqueta de script y asignarle un atributo src que apunte al servidor remoto. Podemos extraer JQuery de un CDN por ejemplo y esperar que funcione.

Cómo funciona JSONP.

Cuando realizamos una solicitud JSONP, nuestro código agrega dinámicamente una etiqueta de script a la página . La etiqueta de secuencia de comandos tiene un atributo de origen que apunta a la URL de la API de JSONP remota, como si estuviera insertando una secuencia de comandos desde un CDN.

La secuencia de comandos JSONP devuelta por el servidor se ajusta en una llamada de función . Cuando se descarga el script, la función se ejecutará automáticamente.

Es por eso que tenemos que decirle al JSONP el nombre de la función de devolución de llamada en la que queremos incluir el script. Se llamará a esa función una vez que el script se haya descargado.

Preocupaciones de seguridad

Hay algunas preocupaciones de seguridad bastante grandes aquí. El script que está descargando podría tomar el control de su página y poner en riesgo a sus usuarios. JSONP no es seguro para sus usuarios, simplemente no está bloqueado por los navegadores web. JSONP realmente es un exploit de navegador que estamos aprovechando . Utilizar con precaución.

Usado sabiamente, JSONP es bastante impresionante sin embargo.

Estoy teniendo problemas para conectar algunos puntos después de haber aprendido recientemente de JSONP. Aquí está mi entendimiento:

  • XmlHttpRequests de dominio cruzado para cualquier contenido (incluido JSON) está prohibido, debido a la misma política de origen. Esto protege contra XSRF.
  • Se le permite tener una etiqueta de secuencia de comandos con un src que devuelve JSONP, algo de JSON rellenado dentro de una llamada a una función de Javascript (diga ''Foo'')
  • Puede tener alguna implementación de ''foo'' en la página a la que se llamará cuando se devuelvan los datos JSONP, y puede hacer cosas con los datos JSON a los que se pasa la función.

¿Por qué está bien recibir datos de dominios cruzados si vinieron a través de JSONP, pero no si vinieron a través de JSON?

¿Existe la suposición de que JSON es propenso a permitir XSRF pero JSONP no lo es? Si es así, ¿hay alguna razón para que no sea JSONP algún formato de datos de facto que nunca proporcione datos que permitan XSRF? ¿Por qué JSONP y no una etiqueta raíz arbitraria en XML en su lugar?

Gracias de antemano por sus respuestas, por favor haga que mi cerebro vuelva a funcionar después de no poder resolver esto.


No sé cómo surgió la percepción de que JSONP es seguro, pero vea

JSON-P es, por esa razón, visto por muchos como un enfoque inseguro y pirateado para el Ajax de dominio cruzado, y por una buena razón. Los autores deben ser diligentes para hacer solo las llamadas a servicios web remotos que controlan o confían implícitamente, para no exponer a sus usuarios a daños.

y

La parte más crítica de esta propuesta es que los proveedores de navegadores deben comenzar a aplicar esta regla para las etiquetas de script que reciben contenido JSON-P, y arrojar errores (o al menos detener el procesamiento) en cualquier contenido JSON-P no conforme.

Ambas citas de http://json-p.org/ .

Otros enlaces con información útil sobre JSONP / seguridad:

todo esto dice dos cosas: básicamente no se considera "seguro", pero hay ideas sobre cómo hacerlo "más seguro" ... aunque la mayoría de las ideas se basan en la estandarización Y la lógica de verificación específica que se integrará en los navegadores, etc.