Sichere Kommunikation zwischen Browser und nativer Anwendung

12

Ich arbeite an einer Webanwendung, die Daten benötigt, die nur von ihrem lokal installierten nativen Anwendungsbrowser abgerufen werden können.

Wie können Sie die Browser-Sandbox umgehen, um mit einer nativen Anwendung sicher zu kommunizieren (da die Daten möglicherweise vertraulich sind)?

In dem einzigen Beispiel, das ich gefunden habe, verschiebt der Benutzer einige Token und Dateien manuell zwischen den beiden, was eine schreckliche Benutzererfahrung ist, die ich vermeiden möchte.

Zak Kus
quelle
1
Möglicherweise können Sie eine Lösung zum Laufen bringen, bei der die native Anwendung einen kleinen Webserver enthält, der auf localhost ausgeführt wird.
Amon
Ich dachte auch das ... Ich hatte vage, nicht konsolidierte Bedenken, dass das nicht "besorgt" sein würde. Gibt es heute Beispiele für Anwendungen, die dies tun? (Schreiben Sie dies in eine Antwort und Sie werden wahrscheinlich die Punkte bekommen)
Zak Kus
Ein eingebetteter Browser wäre das Beste. Betten Sie den Browser in die App ein und programmieren Sie Ihre Interaktionen nach Bedarf.
GregJava

Antworten:

7

Sie können einen Webserver in die native Anwendung einbetten, und Ihr Client kann ihn über fest codierte Links zu http: // localhost / xyz aufrufen (möglicherweise müssen Sie sich hier Gedanken über Cross-Site-Scripting-Warnungen machen und / oder den Server ausführen auf einem Nicht-http-Port). Wenn Sie Websockets verwenden, kann Ihre native Anwendung sogar Daten an den Webbrowser senden, sobald der Browser die Kommunikation initiiert hat.

Ich mache es selbst lokal, ein eingebettetes Webbrowser-Steuerelement fordert Visualisierungsdaten von einem benutzerdefinierten Webserver an und bei der Entwicklung führe ich beide auf demselben PC aus.

Es gibt viele winzige und effiziente eingebettete Webserver für C / C ++ (Mongoose, NxWeb, Civetweb usw.). C # tendiert dazu, einen voll funktionsfähigen WCF-Server zu verwenden. Python enthält einen kleinen Webserver in IIRC.

gbjbaanb
quelle
Ich arbeite an einer solchen Lösung, aber es gibt einige Probleme, wenn der Browser versucht, eine Verbindung über einen Websocket von einer Webseite einer Internetdomäne (www.mydomain.com) mit einem lokalen Host-Websocket-Server herzustellen, insbesondere wenn die Webseite bedient wird Für HTTPS muss der Websocket-Server für die Verwendung von wss (WebSocket mit SSL) konfiguriert sein. Wenn Sie ein selbstsigniertes Zertifikat verwenden, um den Websocket-Server zu "sichern", wird Ihre Websocket-Verbindung dem Browser nicht gefallen. Firefox lässt dies zu, sobald Sie das unsichere lokale Zertifikat akzeptieren, aber andere Browser lassen Sie keine so einfache Verbindung herstellen.
David
1
Für c # ist der beste eingebettete Webserver heutzutage wahrscheinlich ein selbst gehosteter Owin.
Esben Skov Pedersen
8

Es gibt verschiedene Möglichkeiten, eine native App und eine Browser-App miteinander zu verbinden.

Sie können den Browser in die native App einbetten, ähnlich wie es PhoneGap-Apps auf Mobilgeräten tun. Auf diese Weise können Sie die Javascript-Engine des Browsers erweitern und Anrufe zwischen den beiden tätigen.

Alternativ können Sie Ihre Architektur überdenken. Lassen Sie sowohl die native Anwendung als auch die browserbasierte Anwendung den Server als Vermittler verwenden. Daher kommunizieren sowohl der Browser als auch die native Anwendung nur mit dem Webserver, der bei Bedarf Informationen zwischen den beiden weiterleitet.

Oder wenn Sie native Funktionen benötigen ... erstellen Sie einfach eine einzelne native Anwendung.

Ich empfehle den Ansatz des "lokalen Webservers" nur für Anwendungen, die in kontrollierten Umgebungen ausgeführt werden. Wenn Ihre Software auf Endbenutzercomputern mit minimalen Supportanforderungen installiert und ausgeführt werden soll, werden Sie mit einer ganzen Reihe von Problemen im Zusammenhang mit Firewall- und Antivirensoftware konfrontiert sein.

GroßmeisterB
quelle
Die Daten, die ich von der nativen App benötige, beziehen sich darauf, ob dieser Computer (und nicht der Benutzer) akzeptabel ist. Wenn Sie einen normalen Webserver als Zwischenstation verwenden, können Sie sicher sein, dass der Computer, auf dem sich der Browser befindet, derselbe ist, den die native App bewertet hat. Ich stimme auch vollkommen zu, sollte nicht ohne guten Grund zwei haben, aber wir haben unsere Gründe ^ _ ^
Zak Kus
Außerdem ist mir nicht klar, wie das Einbetten eines Browsers in die native App tatsächlich die Kommunikation zwischen dem Browser und der nativen App ermöglichen würde
Zak Kus
@Zak Wie gesagt, Sie können die Javascript-Engine erweitern, damit sie miteinander kommunizieren können, wie es PhoneGap auf mobilen Apps tut. Sie definieren Methoden, die vom Javascript auf der Seite aufgerufen werden können und von der nativen App ausgeführt werden, oder rufen Javascript-Funktionen von der nativen App aus auf.
Großmeister
Die Verwendung eines solchen eingebetteten Browsers wäre meiner Meinung nach der beste Weg, um sicherzustellen, dass der Browser auf dem Computer ausgeführt wird, auf dem er ausgeführt werden muss.
Großmeister
Technisch würde ich zustimmen, dass eine native App mit einer Webansicht der einfachste Weg ist. Laut diesem deutschsprachigen Artikel von heise online weist der Android Web-Viewer für Android 4.3 und darunter schwerwiegende Sicherheitsprobleme auf, die nicht behoben werden können.
k3b