Ajax usando https em uma página http

101

Meu site usa protocolo http e https; não afeta o conteúdo. Meu site usa chamadas jQuery ajax, que preenchem algumas áreas da página também.

Agora, eu gostaria de fazer todas as chamadas ajax por https. (por favor, não me pergunte por quê :)) Quando estou em uma página com protocolo https, as solicitações ajax estão funcionando. Quando estou em uma página com protocolo http, recebo um erro de javascript: Acesso ao URI restrito negado

Eu sei que este é um problema de domínio cruzado (na verdade, é um problema de protocolo cruzado) e sei que devo usar o mesmo protocolo em chamadas ajax como na página atual.

Ainda assim, quero que todas as chamadas ajax sejam https e chamá-las em uma página que foi servida por http. Existe alguma solução alternativa para conseguir isso (alguma solução json / proxy?), Ou é simplesmente impossível?

user135863
fonte
4
Por que não combinar o ajax com o protocolo da página de carregamento?
scheibk
45
Eles disseram especificamente: "Por favor, não me pergunte por quê."
Chris Moschini
Por que você precisa de AJAX com HTTPS ...
Miles
4
Por exemplo, para um formulário de checkout mais dinâmico, que se conecta a um gateway de pagamento como o paypal em segundo plano, para que as pessoas possam ver o que está acontecendo. Apenas uma das possibilidades
kentor

Respostas:

11

Experimente JSONP.

a maioria das bibliotecas JS torna isso tão fácil quanto outras chamadas AJAX, mas usa internamente um iframe para fazer a consulta.

se você não estiver usando JSON para sua carga útil, terá que rolar seu próprio mecanismo em torno do iframe.

pessoalmente, eu apenas redirecionaria da página http: // para a página https: //

Javier
fonte
1
hmm eu tentei jquery .ajax com jsonp: 'jsonp_callback' conjunto de opções, mas ainda mesmo erro de js.
user135863
talvez você precise adicionar o parâmetro de retorno de chamada no URL
Javier
@ user135863 O endpoint para o qual você está enviando a consulta é compatível com JSONP em primeiro lugar?
Leigh Brenecki
1
Para o bem da minha sanidade, vou continuar com sua última opção ... Redirecionar simples parahttps:
Dzeimsas Zvirblis
9

http://example.com/ pode resolver para um VirtualHost diferente de https://example.com/ (que, como o cabeçalho do Host não é enviado, responde ao padrão para aquele IP), então os dois são tratados separadamente domínios e, portanto, sujeito a restrições de crossdomain JS.

Os retornos de chamada JSON podem permitir que você evite isso.

ceejayoz
fonte
link morto em retornos de chamada JSON :(
Kubie
@Kubie Esta resposta tem dez anos amanhã, e links quebrados são o motivo pelo qual pedimos que as perguntas incluam informações suficientes para sobreviver a uma.
ceejayoz
só notei os 10 anos ha ... e sim bom ponto. Tudo bem, vou procurar esta resposta no Google e editar a resposta se eu encontrar alguma coisa
Kubie
4

Confira o projeto de código aberto do Forge. Ele fornece uma implementação JavaScript TLS, junto com algum Flash para lidar com as solicitações reais entre domínios:

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

Resumindo, o Forge permitirá que você faça XmlHttpRequests de uma página da web carregada em http para um site https. Você precisará fornecer um arquivo de política de domínio cruzado Flash por meio de seu servidor para habilitar as solicitações de domínio cruzado. Verifique as postagens do blog no final do README para obter uma explicação mais aprofundada sobre como funciona.

No entanto, devo mencionar que o Forge é mais adequado para solicitações entre dois domínios https diferentes. A razão é que existe um ataque MiTM potencial. Se você carregar o JavaScript e o Flash de um site não seguro, ele pode estar comprometido. O uso mais seguro é carregá-lo de um site seguro e depois usá-lo para acessar outros sites (seguros ou não).

dlongley
fonte
2

Você pode tentar carregar a página https em um iframe e rotear todas as solicitações ajax dentro / fora do quadro por meio de alguma ponte, é um hackaround, mas pode funcionar (não tenho certeza se vai impor as mesmas restrições de acesso dado o contexto seguro) . Caso contrário, um proxy http local para redirecionar solicitações (como qualquer chamada entre domínios) seria a solução aceita.

Quintin Robinson
fonte
2
Depois de ler este tópico, eu continuaria com JSONP dslreports.com/forum/r21425467-IFrame-With-HTTPS-on-HTTP-Page
JGFMK
Isso pode ser feito, mas certifique-se de definir os cabeçalhos P3P se precisar de cookies de sessões do iFrame ... do contrário, o MSE dirá "nu uh uh"
srquinn
2

Aqui está o que eu faço:

Gere um iframe oculto com os dados que você gostaria de postar. Como você ainda controla esse iframe, a mesma origem não se aplica. Em seguida, envie o formulário nesse iFrame para a página SSL. A página SSL então redireciona para uma página não SSL com mensagens de status. Você tem acesso ao iFrame.

kjv
fonte
Isso pode ser feito, mas certifique-se de definir os cabeçalhos P3P se precisar de cookies de sessões do iframe ... caso contrário, o MSE dirá "nu uh uh"
srquinn