Ajax verwendet https auf einer http-Seite


101

Meine Website verwendet das http- und das https-Protokoll. es hat keinen Einfluss auf den Inhalt. Meine Site verwendet jQuery Ajax-Aufrufe, die auch einige Bereiche auf der Seite ausfüllen.

Jetzt möchte ich alle Ajax-Anrufe über https tätigen. (Bitte fragen Sie mich nicht warum :)) Wenn ich auf einer Seite mit dem https-Protokoll bin, funktionieren Ajax-Anfragen. Wenn ich mich auf einer Seite mit http-Protokoll befinde, wird ein Javascript-Fehler angezeigt: Zugriff auf eingeschränkten URI verweigert

Ich weiß, dass dies ein domänenübergreifendes Problem ist (tatsächlich ist es ein protokollübergreifendes Problem), und ich weiß, dass ich bei Ajax-Aufrufen dasselbe Protokoll verwenden sollte wie auf der aktuellen Seite.

Trotzdem möchte ich, dass alle Ajax-Anrufe https sind und sie auf einer Seite aufrufen, die über http bereitgestellt wurde. Gibt es eine Problemumgehung, um dies zu erreichen (eine JSON / Proxy-Lösung?), Oder ist dies einfach unmöglich?


4
Warum nicht den Ajax an das Ladeseitenprotokoll anpassen?
Scheibk

45
Sie sagten ausdrücklich: "Bitte frag mich nicht warum."
Chris Moschini

Warum brauchen Sie AJAX mit HTTPS?
Meilen

4
Zum Beispiel für ein dynamischeres Checkout-Formular, das eine Verbindung zu einem Zahlungsgateway wie Paypal im Hintergrund herstellt, damit die Leute sehen können, was passiert. Nur eine von mehreren Möglichkeiten
Kentor

Antworten:


58

Fügen Sie den Header Access-Control-Allow-Origin vom Server hinzu

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

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


7
Tolle Antwort - aber nicht unterstützt von einigen verwendeten Browsern wie Opera (überhaupt nicht) und Internet Explorer (unterstützt seit Version 8) caniuse.com/#search=cors
SimonSimCity

1
Scheint, als würde Opera es jetzt unterstützen: en.wikipedia.org/wiki/… Nur nicht Opera Mini ...
gitaarik

11

Versuchen Sie es mit JSONP.

Die meisten JS-Bibliotheken machen es genauso einfach wie andere AJAX-Aufrufe, verwenden jedoch intern einen Iframe, um die Abfrage durchzuführen.

Wenn Sie JSON nicht für Ihre Nutzdaten verwenden, müssen Sie Ihren eigenen Mechanismus um den Iframe rollen.

persönlich würde ich nur von der http: // Seite zur https: // Seite umleiten


1
hmm ich habe jquery .ajax mit jsonp ausprobiert: 'jsonp_callback' option gesetzt, aber immer noch der gleiche js fehler.
user135863

Vielleicht müssen Sie den Rückrufparameter in die URL einfügen
Javier

@ user135863 Wird der Endpunkt, an den Sie die Abfrage senden, überhaupt JSONP unterstützen ?
Leigh Brenecki

1
Aus Gründen meiner https:
geistigen Gesundheit

9

http://example.com/ wird möglicherweise in einen anderen VirtualHost als https://example.com/ aufgelöst (der, da der Host-Header nicht gesendet wird, auf die Standardeinstellung für diese IP reagiert), sodass die beiden als getrennt behandelt werden Domains und unterliegen somit domänenübergreifenden JS-Einschränkungen.

Mit JSON-Rückrufen können Sie dies möglicherweise vermeiden.


toter Link auf JSON-Rückrufen :(
Kubie

@Kubie Diese Antwort ist morgen zehn Jahre alt, und defekte Links sind der Grund, warum wir Fragen stellen, die genügend Informationen enthalten, um eine zu überleben.
Ceejayoz

habe gerade die 10 Jahre bemerkt ha ... und ja guten Punkt. Es ist okay, werde nach dieser suchen und die Antwort bearbeiten, wenn ich etwas finde
Kubie

4

Schauen Sie sich das OpenSource Forge-Projekt an. Es bietet eine JavaScript-TLS-Implementierung sowie Flash, um die tatsächlichen domänenübergreifenden Anforderungen zu verarbeiten:

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

Kurz gesagt, mit Forge können Sie XmlHttpRequests von einer über http geladenen Webseite auf eine https-Site erstellen. Sie müssen eine domänenübergreifende Flash-Richtliniendatei über Ihren Server bereitstellen, um die domänenübergreifenden Anforderungen zu aktivieren. Lesen Sie die Blog-Beiträge am Ende der README-Datei, um eine ausführlichere Erklärung der Funktionsweise zu erhalten.

Ich sollte jedoch erwähnen, dass Forge besser für Anfragen zwischen zwei verschiedenen https-Domänen geeignet ist. Der Grund ist, dass es einen möglichen MiTM-Angriff gibt. Wenn Sie JavaScript und Flash von einer nicht sicheren Site laden, kann dies gefährdet sein. Am sichersten ist es, es von einer sicheren Site zu laden und dann auf andere Sites zuzugreifen (sicher oder auf andere Weise).


2

Sie könnten versuchen, die https-Seite in einen Iframe zu laden und alle Ajax-Anforderungen über eine Bridge in den Frame / aus dem Frame zu leiten. Dies ist eine Hackaround-Funktion, funktioniert jedoch möglicherweise (nicht sicher, ob sie angesichts des sicheren Kontexts dieselben Zugriffsbeschränkungen auferlegt). . Andernfalls wäre ein lokaler http-Proxy zum Umleiten von Anforderungen (wie bei domänenübergreifenden Anrufen) die akzeptierte Lösung.


2
Nachdem ich diesen Thread gelesen hatte, blieb ich bei JSONP dslreports.com/forum/r21425467-IFrame-With-HTTPS-on-HTTP-Page
JGFMK

Dies kann getan werden, aber stellen Sie sicher, dass Sie P3P-Header setzen, wenn Sie Sitzungscookies vom iFrame benötigen ... andernfalls sagt MSE "nu uh uh"
srquinn

2

Folgendes mache ich:

Generieren Sie einen versteckten iFrame mit den Daten, die Sie veröffentlichen möchten. Da Sie diesen iFrame weiterhin steuern, gilt derselbe Ursprung nicht. Senden Sie dann das Formular in diesem iFrame an die SSL-Seite. Die SSL-Seite leitet dann zu einer Nicht-SSL-Seite mit Statusmeldungen weiter. Sie haben Zugriff auf den iFrame.


Dies kann getan werden, aber stellen Sie sicher, dass Sie P3P-Header setzen, wenn Sie Sitzungscookies vom iFrame benötigen ... andernfalls sagt MSE "nu uh uh"
srquinn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.