2012-07-02 32 views
10

Estoy trabajando en una aplicación web para dispositivos móviles, y jsonp es muy bueno para solicitudes entre dominios, pero la API del servidor no admite el parámetro de devolución de llamada. Así que solo puedo usar json para obtener datos del servidor remoto.jQuery - Cómo eliminar la limitación de dominios cruzados

Intenté json en jQuery, parece que no es compatible con solicitudes entre dominios. Intenté la función de solicitud raw ajax en safari, y funciona bien en dominios cruzados, así que ¿puedo eliminar la limitación de dominios cruzados para la solicitud json en jQuery? (no jsonp, solo json), y cómo hacerlo?

¿O existe una biblioteca ajax simple alternativa (navegador web cruzado) y puede hacer json en solicitudes entre dominios?

+1

Se hará probablemente encuentre la respuesta a su pregunta entre las respuestas a [Formas de eludir la política del mismo origen] (http://stackoverflow.com/questions/3076414/ways-to-circumvent-the-same-origin-policy). Tu pregunta parece ser esencialmente la misma. –

+0

Estoy usando YQL + jQuery para acceder al contenido de dominios cruzados. –

Respuesta

31

política del mismo origen

Está intentando eludir la Same Origin Policy. Está integrado en cada navegador y normalmente no es algo que pueda o deba deshabilitar/solución alternativa/etc. Es un contrato de seguridad muy importante entre su sitio, el usuario y el navegador del usuario.

CORS (posible)

CORS permite a su servidor web para contar los navegadores/clientes que acceden a otro dominio es permisible. Esto se logra haciendo que la salida siguiente encabezado HTTP mediante el servidor web

Access-Control-Allow-Origin: http://www.example.com 

Si no puede controlar sus cabeceras HTTP, entonces no se puede utilizar CORS. La implementación de esto es específica del lenguaje/marco.

Tenga en cuenta que debe comprobar para asegurar browser compatibility como IE8/9 tenía soporte limitado. También tenga en cuenta que este es un vector de ataque potencial. Permite respuestas de sitios de terceros para ejecutar ataques XSS si utiliza los datos de respuesta de manera irresponsable.

JSONP (posible)

JSONP es una forma inteligente de pasar y obtener los datos entre servidores añadiendo dinámicamente una etiqueta script con un atrribuya src igual a "yoururl.com?<your parameter data>" a su página. Es la única manera legítima de lograr tal hazaña sin un proxy web (ver a continuación) o un applet (Flash/Java). Sin embargo, tiene sus propios riesgos de seguridad si usted no es el proveedor de ambos extremos de la solicitud. Recuerde que JSONP le permite al servidor remoto ejecutar código dentro de su contexto y usted debe ser very careful who you give that power to.

"vainilla" AJAX (no es posible)

Si no está utilizando el JSONP para obtener los datos a continuación, es muy probable que intentando utilizar una petición AJAX para obtener los datos. Las solicitudes AJAX también están sujetas a la misma política de origen. Las bibliotecas JavaScript (por ejemplo, jQuery, Prototype, Dojo, etc.) no pueden eludir esta política como comportamiento base para una solicitud Ajax. Sin embargo, pueden admitir JSONP (que ahora lo recuerda, no es AJAX).

AJAX w/Proxy Web (posible)

Si desea solicitar datos desde otro servidor, puede enviar su solicitud. El servidor de su sitio principal actuará como un proxy.Tendrá que hacer una solicitud AJAX a su propio servidor, ese código del lado del servidor hará una solicitud al otro dominio y luego enviará la respuesta a su secuencia de comandos a través de la respuesta de llamadas AJAX.

Este es un patrón común y se detalla aquí como el Web Proxy Pattern y un amistoso de Yahoo. here (but remember it's Yahoo specific, just take the general idea). Sin embargo, depende del idioma del lado del servidor. La implementación general será la misma, sin embargo, el código para hacerlo variará según el idioma de elección del servidor (PHP, Ruby, Python, C, etc.). Algunos idiomas ya tendrán bibliotecas/módulos/etc. para soportar dicho patrón.

flash (posible, no predeterminada)

flash en su estado predeterminado no admite solicitudes de dominios cruzados. Se puede activar en Flash7 + con cross-domain policy files, pero es muy recomendable. Su secuencia de comandos tendría que interactuar con una API Flash que haría las solicitudes y devolvería los datos a su JavaScript.

applet de Java (posible, no predeterminada)

Java también está sometido a la política del mismo origen, pero tiene un trabajo similar en torno a Flash como described here on its release.

Varios otros "hacks"

Hay otros hacks por ahí, pero por lo general requieren que controlar ambos extremos o tienen un acuerdo sobre la norma para la comunicación. Por ejemplo, el truco 'window.name'. No sugiero la mayoría de estos métodos. se ha pedido

Otras soluciones

Otra pregunta similar a esta. En él se esbozan algunos otros métodos que no cubre: Ways to circumvent the same-origin policy

las mejores soluciones

  1. CORS - si confía en la tercera parte
  2. Proxy Web
  3. - si no lo hace

Un proxy web en su propio dominio puede permitirle desinfectar los datos que se recuperan, ya que ofrece a su usuario la mayor protección. Sin embargo, si no aplica el saneamiento cero, no es más seguro que cualquiera de los métodos descritos aquí. Si implementa un proxy web de algún tipo, asegúrese de que sus solicitudes se limiten ay desde los sitios que desea. De lo contrario, creará esencialmente un open proxy, que los usuarios podrían abusar si se descubriera y meterlo en problemas legales.

4

una manera bastante mal gusto de hacerlo sería lo que he hecho a continuación para habilitar la ejecución de este tipo de ataque en un proyecto personal

tenga en cuenta que esto se haría en el servidor receptor no es el envío de una

if ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') === FALSE) 
     die('You shouldn\'t be here'); 

    header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']); 
    header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); 
    header('Access-Control-Max-Age: 1000'); 
    header('Access-Control-Allow-Headers: Content-Type'); 

si quieren que sea un poco más seguro que podría hacer

if ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') === FALSE) 
     die('You shouldn\'t be here'); 

switch($_SERVER['HTTP_ORIGIN']){ 
case 'domain.com': 
case 'whatever.com': 
     header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']); 
     header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); 
     header('Access-Control-Max-Age: 1000'); 
     header('Access-Control-Allow-Headers: Content-Type'); 
} 

esperanza esto ayuda a que me llevó para siempre a la figura hacia fuera lol.

+8

Puede agregar algo de [referencia] (http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) al método que está describiendo, a saber [CORS] (http://www.w3.org/TR/ cors /). –

6

Tuve el mismo problema. Intentando obtener json de un servidor al que no tuve acceso (=> no JSONP).

He encontrado http://benalman.com/projects/php-simple-proxy/ Añadir el proxy php a su servidor y hacer la llamada AJAX a este archivo. "Cualquier parámetro GET que deba pasarse al recurso URL remoto debe estar urlencoded en este parámetro".

$.ajax({ 
    type: 'GET', 
    url:'proxy.php?url=http://anyDomain.com?someid=thispage', 
    dataType: "json", 
    success: function(data){ 
     // success_fn(data); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // error_fn(jqXHR, textStatus, errorThrown); 
    } 
}); 

donde proxy.php (el archivo de Ben Alman) está alojado en el dominio de


Alternativa (que he encontrado para ser el segundo mejor a este): http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

+0

Bueno, gracias! – Tom

Cuestiones relacionadas