Ajax usando https en una página http

101

Mi sitio utiliza el protocolo http y https; no afecta el contenido. Mi sitio usa llamadas jQuery ajax, que también llena algunas áreas de la página.

Ahora, me gustaría hacer todas las llamadas ajax a través de https. (por favor, no me pregunte por qué :)) Cuando estoy en una página con protocolo https, las solicitudes ajax funcionan. Cuando estoy en una página con protocolo http, aparece un error de javascript: acceso a URI restringido denegado

Sé que este es un problema de dominio cruzado (de hecho, es un problema de protocolo cruzado), y sé que debería usar el mismo protocolo en las llamadas ajax que en la página actual.

Aún así, quiero que todas las llamadas ajax sean https y las llame en una página que se sirvió a través de http. ¿Hay alguna solución para lograr esto (¿alguna solución json / proxy?), ¿O es simplemente imposible?

usuario135863
fuente
4
¿Por qué no hacer coincidir el ajax con el protocolo de página de carga?
Scheibk
45
Ellos dijeron específicamente "Por favor, no me pregunten por qué".
Chris Moschini
Sin embargo, ¿por qué necesita AJAX con HTTPS ...?
Miles
4
Por ejemplo, para un formulario de pago más dinámico que se conecta a una pasarela de pago como PayPal en segundo plano para que la gente pueda ver lo que está sucediendo. Solo una de más posibilidades
kentor

Respuestas:

11

Prueba JSONP.

la mayoría de las bibliotecas JS lo hacen tan fácil como otras llamadas AJAX, pero utilizan internamente un iframe para realizar la consulta.

si no está utilizando JSON para su carga útil, tendrá que poner su propio mecanismo alrededor del iframe.

personalmente, simplemente redirigiría de la página http: // a la https: //

Javier
fuente
1
hmm, he probado jquery .ajax con jsonp: conjunto de opciones 'jsonp_callback', pero sigue siendo el mismo error de js.
user135863
tal vez tenga que agregar el parámetro de devolución de llamada en la URL
Javier
@ user135863 ¿El punto final al que está enviando la consulta es compatible con JSONP en primer lugar?
Leigh Brenecki
1
Por el bien de mi cordura, voy a ir con su última opción ... Redirección simple ahttps:
Dzeimsas Zvirblis
9

http://example.com/ puede resolverse en un VirtualHost diferente a https://example.com/ (que, como el encabezado del Host no se envía, responde al valor predeterminado para esa IP), por lo que los dos se tratan como separados dominios y, por lo tanto, sujetos a restricciones JS de dominios cruzados.

Las devoluciones de llamada JSON pueden permitirle evitar esto.

ceejayoz
fuente
enlace muerto en devoluciones de llamada JSON :(
Kubie
@Kubie Esta respuesta tiene diez años mañana y los enlaces rotos son la razón por la que pedimos que las preguntas incluyan suficiente información para sobrevivir a una.
ceejayoz
acabo de notar los 10 años ha ... y sí buen punto. Está bien, buscaré en Google para esta y editaré la respuesta si encuentro algo
Kubie
4

Echa un vistazo al proyecto Forge de código abierto. Proporciona una implementación TLS de JavaScript, junto con algo de Flash para manejar las solicitudes reales entre dominios:

http://github.com/digitalbazaar/forge/blob/master/README

En resumen, Forge le permitirá realizar XmlHttpRequests desde una página web cargada a través de http a un sitio https. Deberá proporcionar un archivo de política Flash entre dominios a través de su servidor para habilitar las solicitudes entre dominios. Consulte las publicaciones del blog al final del README para obtener una explicación más detallada de cómo funciona.

Sin embargo, debo mencionar que Forge es más adecuado para solicitudes entre dos dominios https diferentes. La razón es que existe un posible ataque MiTM. Si carga JavaScript y Flash desde un sitio no seguro, podría verse comprometido. El uso más seguro es cargarlo desde un sitio seguro y luego usarlo para acceder a otros sitios (seguros o no).

dlongley
fuente
2

Puede intentar cargar la página https en un iframe y enrutar todas las solicitudes de ajax dentro / fuera del marco a través de algún puente, es un truco pero podría funcionar (no estoy seguro si impondrá las mismas restricciones de acceso dado el contexto seguro) . De lo contrario, la solución aceptada sería un proxy http local para redireccionar las solicitudes (como cualquier llamada entre dominios).

Quintin Robinson
fuente
2
Después de leer este hilo, me quedaría con JSONP dslreports.com/forum/r21425467-IFrame-With-HTTPS-on-HTTP-Page
JGFMK
Esto se puede hacer, pero asegúrese de configurar los encabezados P3P si necesita cookies de sesión del iFrame ... de lo contrario, MSE dirá "nu uh uh"
srquinn
2

Esto es lo que hago:

Genere un iFrame oculto con los datos que le gustaría publicar. Dado que todavía controlas ese iFrame, no se aplica el mismo origen. Luego envíe el formulario en ese iFrame a la página ssl. La página ssl luego redirige a una página que no es ssl con mensajes de estado. Tienes acceso al iFrame.

kjv
fuente
Esto se puede hacer, pero asegúrese de configurar los encabezados P3P si necesita cookies de sesión del iFrame ... de lo contrario, MSE dirá "nu uh uh"
srquinn