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?

user135863
quelle
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

DalSoft
quelle
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

Javier
quelle
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.

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

dlongley
quelle
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.

Quintin Robinson
quelle
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.

kjv
quelle
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