Ist JSONP sicher zu verwenden?

Gibt es Sicherheitsprobleme, die bei der Verwendung von JSONP berücksichtigt werden sollten?

    Update : JSONP ist ein häufiger Hack, um domainübergreifende Anfragen zu bearbeiten. Moderne Browser haben jetzt Cross-Origin-Ressourcen-Sharing und IE8 + haben XDomainRequest, die ähnlich ist. Siehe http://enable-cors.org/ für weitere Informationen.

    JSONP ist nur ein Skript-Include, mit dem Sie einen callback verwenden können. Sie sollten jedoch auf Cross-Site Request Forgery (CSRF) achten .

    Solange Sie das Skript und den Server steuern, ist JSONP nicht mehr unsicher als ein Skript-Include. Es sei denn, Sie haben einen JSONP-Dienst, der vertrauliche Daten an angemeldete Benutzer zurückgibt. Eine bösartige Website kann eine Anfrage an den Dienst senden (in der Hoffnung, dass der Benutzer auf Ihrer Website angemeldet ist) und die Daten erneut abrufen. Der Dienst kann den Referrer der Anfrage prüfen, aber es ist möglich, den Referrer mit Flash zu spoofen (danke Chris Moschini).

    Stellen Sie sich folgendes Szenario vor: – Ein Benutzer meldet sich bei seinem Internet-Banking-Konto an. Speichern eines Sitzungscookies im Browser des Benutzers Diese Seite hat einen jsonp-Dienst mit sensiblen Informationen über den Benutzer und seine Konten. – Andere Websites werden nicht wissen, dass der Benutzer angemeldet ist, aber sie könnten eine wilde Vermutung treffen und versuchen, auf den jsonp-Dienst zuzugreifen. Da der Benutzer ein Sitzungscookie hat, erhält der Browser eine Antwort, und nichts hindert die Site daran, einen Ajax-Post zu erstellen, um die sensiblen Daten auf ihrem Server zu speichern.

    Update 28. Juni 2012 : Wenn Sie sich gegen CSRF-Angriffe schützen möchten, sollten Sie diesen ausführlichen Blogbeitrag von einem Sicherheitsexperten lesen: http://erlend.oftedal.no/blog/?blogid=130

    Ja, Sie müssen vorsichtig sein, aber bei richtiger Verwendung mit vertrauenswürdigen Diensten ist es relativ sicher.

    Hier ist eine Zusammenfassung der Sicherheitsprobleme mit JSONP, wie ich es verstehe:

    Aus der Sicht des Verbrauchers:

    • Sie müssen dem Anbieter vertrauen, dass er anstelle des erwarteten JSON, der in den von Ihnen angegebenen JSONP-callback eingeschlossen ist, kein schädliches JavaScript zurückgibt.
    • Das gleiche gilt auch für eingebettete JavaScript-Add-Ons von Drittanbietern wie Google Analytics.
    • Es ist nur ähnlich zu XSS-Angriffen, da es Drittanbietern erlaubt, beliebiges JavaScript in Ihrer Anwendung auszuführen, jedoch müssen Sie zuerst wählen, dieser dritten Partei zu vertrauen, indem Sie die Anfrage an erster Stelle stellen.

    Aus Sicht des Anbieters:

    • Sie dürfen nicht davon ausgehen, dass, obwohl die Cookies des Kunden in der Anfrage vorhanden sind, der Verbraucher eine von Ihnen kontrollierte Webseite ist. Überprüfen Sie den Referer-Header auf eine Whitelist mit autorisierten URLs und / oder verlassen Sie sich nicht auf die cookiebasierte Authentifizierung.
    • Analog zu einem CSRF / konfusen Stellvertreterangriff.

    Es gibt Sicherheitsprobleme für beide Seiten. Der schwerwiegendste ist für die Website einschließlich JSONP.

    Wenn Sie eine aus einer anderen Domäne (die Sie nicht steuern) einschließen, kann diese Domäne das Skript jederzeit ändern. Sie können das Javascript machen im Kontext Ihrer Webseite, die Ihr eigenes Javascript tun könnte. Wenn Sie JSONP verwenden, gibt es keine Möglichkeit. Sie sollten die domänenübergreifende Kommunikation mit iframes untersuchen, was am besten durch die ausgezeichnete EasyDXM-Bibliothek geschieht.

    Wenn Sie einen Webservice anbieten, der JSONP verarbeitet, müssen Sie vor Cross-Site Request Forgery (CSRF) schützen. Hier gibt Ihr Webservice vertrauliche Informationen an eingeloggte Benutzer zurück. Wenn sich ein Benutzer bei Ihrer Site angemeldet hat, kann jede andere Site eine GET-Anfrage an den JSONP-Service generieren, und die Cookies Ihrer Domain werden mit der Anfrage übermittelt – im Wesentlichen die Authentifizierung des angemeldeten Benutzers – mit Ausnahme der Remote-Version Domain bekommt die Antwort und kann die sensiblen Daten lesen!

    Der beste Schutz gegen CSRF besteht darin, eine Nonce (eine schwer zu erratende, zufällig generierte Nummer) zu generieren und in der Sitzung zu speichern. Geben Sie dieses Nonce in allen Ihren Formularen auf Ihren Webseiten aus und fügen Sie es in alle JSONP-Anfragen auf Ihren Seiten ein. Stellen Sie auf dem Server sicher, dass die Nonce in der Anfrage vorhanden und korrekt ist (ob es ein GET, POST usw. ist). Andere Domänen können diese Nonce nicht erraten und sind daher trotz der Cookies nicht in der Lage, die vertraulichen Informationen zu erhalten gesendet werden.

    Schließlich gibt es noch ein anderes Sicherheitsproblem: JSONP unterstützt einfach keine Benutzerauthentifizierung im Browser, wie es bei OAuth möglich ist. Sie können natürlich den Server eine Art Zugriffstoken (wie bei OAuth) bekommen lassen und diese benutzen. Wenn Sie jedoch die Authentifizierung vollständig im Browser durchführen möchten, müssen Sie die domänenübergreifende Kommunikation mit iFrames verwenden. Ich denke, so macht es OAuth 2.0. So richten Sie sie ein: Auf Ihrer Website gehostete Seiten haben vollen Zugriff auf Ihren Server. Haben Sie eine JavaScript-Bibliothek, die EasyDXM lädt und verwendet, um einen versteckten iFrame für Ihre Site einzurichten und mit diesem zu kommunizieren.

    JSONP ist definitiv nicht sicher, da es einfach domainübergreifend wie JavaScript läuft.

    Lösung! Lösung!

    Erstellen Sie einen Iframe, vorzugsweise einen Sandkasten, und laden Sie JSONP dort. Fangen Sie das Ergebnis und übergeben Sie es über window.postMessage

    Und ja, jemand hat diese Idee zuerst, wie immer 🙂

    Der Blog-Post ist nicht mehr da, aber ich halte den Link hier für den Kredit: http://beebole.com/blog/general/sandbox-your-cross-domain-jsonp-to-improve-mashup-security/

    Es benutzte den window.name-Hack für iframe-Kommunikation, aber das war für IE6 und 7.