Ajax używający https na stronie http

101

Moja witryna korzysta z protokołów http i https; nie wpływa na zawartość. Moja witryna korzysta z wywołań jQuery ajax, które również wypełniają niektóre obszary strony.

Teraz chciałbym wykonać wszystkie wywołania Ajax przez https. (proszę nie pytać dlaczego :)) Kiedy jestem na stronie z protokołem https, działają żądania AJAX. Kiedy jestem na stronie z protokołem http, pojawia się błąd javascript: odmowa dostępu do zastrzeżonego URI

Wiem, że jest to problem międzydomenowy (w rzeczywistości jest to problem między protokołami) i wiem, że powinienem używać tego samego protokołu w wywołaniach Ajax, jak na bieżącej stronie.

Mimo to chcę, aby wszystkie wywołania ajax były https i wywoływały je na stronie, która była obsługiwana przez http. Czy istnieje jakieś obejście, aby to osiągnąć (jakieś rozwiązanie json / proxy?), Czy jest to po prostu niemożliwe?

user135863
źródło
4
Dlaczego nie dopasować Ajax do protokołu strony ładowania?
scheibk
45
Specjalnie powiedzieli „Proszę, nie pytaj mnie dlaczego”.
Chris Moschini,
Dlaczego potrzebujesz AJAX z HTTPS .....
Miles
4
Na przykład dla bardziej dynamicznego formularza płatności, który łączy się z bramką płatniczą, taką jak paypal w tle, aby ludzie mogli zobaczyć, co się dzieje. Tylko jedna z wielu możliwości
kentor

Odpowiedzi:

58

Dodaj nagłówek Access-Control-Allow-Origin z serwera

Access-Control-Allow-Origin: https://www.mysite.com

http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

DalSoft
źródło
7
Świetna odpowiedź - ale nie jest obsługiwana przez niektóre używane przeglądarki, takie jak Opera (w ogóle) i Internet Explorer (obsługiwana od wersji 8) caniuse.com/#search=cors
SimonSimCity
1
Wygląda na to, że Opera teraz to obsługuje: en.wikipedia.org/wiki/ ... Tylko nie Opera Mini, chociaż ...
gitaarik
11

Wypróbuj JSONP.

większość bibliotek JS sprawia, że ​​jest to tak samo łatwe, jak inne wywołania AJAX, ale wewnętrznie używa ramki iframe do wykonania zapytania.

jeśli nie używasz formatu JSON dla swojego ładunku, musisz obrócić własny mechanizm wokół elementu iframe.

osobiście po prostu przekierowałbym ze strony http: // na stronę https: //

Javier
źródło
1
hmm próbowałem jquery .ajax z jsonp: ustawioną opcją „jsonp_callback”, ale nadal ten sam błąd js.
user135863
być może trzeba będzie dodać parametr wywołania zwrotnego w adresie URL
Javier
@ user135863 Czy punkt końcowy, do którego wysyłasz zapytanie, ma w pierwszej kolejności obsługiwać JSONP?
Leigh Brenecki
1
Ze względu na zdrowie psychiczne https:
wybiorę
9

http://example.com/ może prowadzić do innego hosta wirtualnego niż https://example.com/ (który, jako że nagłówek hosta nie jest wysyłany, odpowiada domyślnemu adresowi IP), więc oba są traktowane jako oddzielne domeny i tym samym podlegają ograniczeniom JS między domenami.

Wywołania zwrotne JSON mogą pozwolić Ci tego uniknąć.

ceejayoz
źródło
martwy link do wywołań zwrotnych JSON :(
Kubie
@Kubie Ta odpowiedź ma jutro dziesięć lat, a zepsute linki powodują, że pytania zawierają wystarczającą ilość informacji, aby przetrwać.
ceejayoz
właśnie zauważyłem 10 lat ha ... i tak, słuszna uwaga. W porządku,
wyszukam ten i edytuję
4

Sprawdź projekt opensource Forge. Zapewnia implementację JavaScript TLS wraz z niektórymi Flash do obsługi rzeczywistych żądań międzydomenowych:

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

Krótko mówiąc, Forge umożliwia tworzenie żądań XmlHttpRequests ze strony internetowej załadowanej za pośrednictwem protokołu HTTP do witryny https. Będziesz musiał dostarczyć plik zasad Flash międzydomenowych za pośrednictwem swojego serwera, aby umożliwić żądania międzydomenowe. Sprawdź posty na blogu na końcu README, aby uzyskać bardziej szczegółowe wyjaśnienie, jak to działa.

Powinienem jednak wspomnieć, że Forge lepiej nadaje się do żądań między dwiema różnymi domenami https. Powodem jest to, że istnieje potencjalny atak MiTM. Jeśli załadujesz JavaScript i Flash z niezabezpieczonej witryny, może to zostać naruszone. Najbezpieczniejszym zastosowaniem jest załadowanie go z bezpiecznej witryny, a następnie użycie go w celu uzyskania dostępu do innych witryn (bezpiecznych lub innych).

dlongley
źródło
2

Możesz spróbować załadować stronę https w ramce iframe i skierować wszystkie żądania AJAX do / z ramki przez jakiś most, jest to hakowanie, ale może zadziałać (nie jestem pewien, czy nałoży te same ograniczenia dostępu, biorąc pod uwagę bezpieczny kontekst) . W przeciwnym razie akceptowanym rozwiązaniem byłby lokalny serwer proxy http do przekierowywania żądań (jak w przypadku wszelkich połączeń między domenami).

Quintin Robinson
źródło
2
Po przeczytaniu tego wątku trzymałbym się JSONP dslreports.com/forum/r21425467-IFrame-With-HTTPS-on-HTTP-Page
JGFMK
Można to zrobić, ale pamiętaj, aby ustawić nagłówki P3P, jeśli potrzebujesz plików cookie sesji z iFrame ... w przeciwnym razie MSE powie "nu uh uh"
srquinn
2

Oto co robię:

Wygeneruj ukrytą ramkę iFrame z danymi, które chcesz opublikować. Ponieważ nadal kontrolujesz ten element iFrame, to samo źródło nie ma zastosowania. Następnie prześlij formularz w tym elemencie iFrame na stronę ssl. Strona ssl następnie przekierowuje na stronę inną niż ssl z komunikatami o stanie. Masz dostęp do iFrame.

kjv
źródło
Można to zrobić, ale pamiętaj, aby ustawić nagłówki P3P, jeśli potrzebujesz plików cookie sesji z iFrame ... w przeciwnym razie MSE powie "nu uh uh"
srquinn