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?


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


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: //


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ąć.


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).


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).


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.