Same Origin Umgehungsstrategien

Permalink

Wie ich ja schon an anderer Stelle festgestellt habe, stellt mich die Same Origin Policy vor ein Problem. Sie besagt das ein Script nicht auf Ressourcen zugreifen darf die an einem anderen Ort liegen. Ein Ort ist hierbei die Kombination aus Protokoll, Host und Port. Vereinfacht ausgedrückt: Jedes Script darf nur auf seine eigene Webseite zugreifen. Das ist aber leider genau das Gegenteil von dem was ein Mashup tun soll. In meinem Fall will ich ja auf die Podcasts von anderen zugreifen. Um das zu erreichen muss man also die Policy umgehen. Hierzu fallen mir ein paar Möglichkeiten ein die ich im folgenden kurz umreißen möchte.

CORS

Da ich natürlich nicht der erste bin der auf fremde Ressourcen zugreifen will gibt es hier auch schon eine entsprechende Technik namens Cross-Origin Resource Sharing. Dabei gibt der Besitzer einer Ressource diese explizit für die Nutzung durch andere frei. Dies geschieht durch spezielle HTTP-Header die im HTTP-Response des Servers gesetzt werden.

Mein Problem hierbei ist das ich am falschen Ende sitze. Damit CORS mir etwas nutzt müsste ich alle Betreiber von Podcasts anschreiben und sie bitten diese Header für mich zu integrieren – Ein aussichtsloses Unterfangen.

Serverseitige Middelware

Eine andere Möglichkeit, die mir mehr Kontrolle verschafft als CORS, ist eine serverseitige Software zu entwickeln. Die SOP greift nämlich nur für Browser nicht für Server.

Eine solche Middleware müsste die Anfragen von der Applikation entgegennehmen und danach die Daten abrufen. Sie kann die Daten dann noch aufbereiten und an den Browser zurücksenden. Bei einer solchen serverseitigen Lösung gibt es allerdings ein paar Aspekte zu berücksichtigen: einige davon sind Sicherheit, Authentifizierung, Zentralisierung, Überwachung und Betriebskosten.

Um mich mit all diesen Dingen umfassend zu beschäftigen fehlt mir momentan die Zeit. Außerdem ist eines der Ziele meines Podcatchers möglichst clientseitig zu funktionieren. Aus diesen Gründen habe ich mich als vorübergehenden Lösung nur eine abgespeckte Version in Form eines Proxys implementiert.

Proxy

Ein Proxy ist in meinem Fall ein serverseitiges Script das genau eine Aufgabe hat. Es nimmt eine Anfrage entgegen, leitet sie an das eigentliche Ziel weiter, empfängt die Antwort und reicht diese wiederum zum Client zurück. Ein Proxy verschleiert gegenüber dem Browser also die eigentliche Zieladresse und umgeht so die SOP.

Hierbei wird allerdings der Datenverkehr aller Benutzer über meinen Server gelenkt. Bei der geltenden deutschen Gesetzeslage erscheint mir das als keine so tolle Idee. Außerdem weiß ich nicht ob mein Hoster das umwerfend finden würde. Aus diesen Gründen habe ich den Zugriff erst mal auf mich selbst beschränkt.

Für mich ist ein Proxy daher auch nur eine Notlösung die nur für Leute taugt die Wissen was sie tun. In diesem Sinne habe ich bislang auch nur eine schmutzige Implementierung eines solchen Proxies für meinen eigenen Bedarf umgesetzt.

Plattformspezifische Apps

Der letzte Ansatz der mir momentan einfällt ist der von installierbaren Apps. Solche Apps haben üblicherweise keine eigene Origin und wenden daher auch die SOP nicht an. Um aus einer Web-App ein “richtiges” Programm zu machen gibt es verschieden Techniken. Das Framework Cordova steckt alle Dateien in einen Wrapper den man dann zum Beispiel in iOS oder Android installieren beziehungsweise in den jeweiligen Stores veröffentlichen kann. Bei Firefox OS ist sowieso alles eine Web-App mit ein wenig Manifest-Magie drumherum. Windows 8 und Windows Phone 8 lassen sich grundsätzlich auch mit Javascript programmieren (wenn ich auch nicht genau weiß wie es funktioniert). Und bei den Desktops gibt es zum Beispiel den Chrome Webstore und den Firefox Marketplace die Web-Apps in die Nähe von installierten Programmen rücken sollen.

Ausblick

Von den obigen vier Ansätzen habe ich eine, den Proxy, implementiert. Das war allerdings nur eine schnelle, pragmatische Lösung um voranzukommen. Diese habe ich außerdem auf meinen persönlichen Gebrauch eingeschränkt. CORS ist nicht praktikabel für mich und für eine serverseitige Middleware mit Authentifizierung und anderem Schnickschnack habe ich gerade keine Motivation. Was ich mir aber gerade näher ansehe sind die einzelnen Plattformen, allen voran Firefox OS.