PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann ich sicher (indirekt) eine Postgresql-Datenbank in Android abfragen?

Schnellversion:

Verwenden Sie einen Webdienst-Midlayer, der auf einem öffentlichen Host ausgeführt wird, den Sie kontrollieren (möglicherweise, aber nicht notwendigerweise der Datenbankhost). Stellen Sie öffentliche Webdienstmethoden bereit, um die begrenzte Arbeit zu erledigen, die Sie zulassen möchten, und sonst nichts.

Verwandte Fragen:

Implementierungsoptionen

Persönlich würde ich einen Java-Anwendungsserver wie Apache Tomcat verwenden oder JBoss AS 7 und ich würde meine Webdienstmethoden mit JAX-RS schreiben um eine schöne API im REST-Stil für meine App zu erstellen. Damit bin ich vertraut und es funktioniert gut, aber Sie haben viele Optionen, einschließlich Implementierungen von:

  • REST-ähnliche APIs (Javas JAX-RS impliziert Jersey und RESTEasy, verschiedene andere Langs-Tools), die HTTP-Anforderungen verwenden und JSON- oder XML-Antworten erzeugen.

  • SOAP mit WSDL, der klassischen „Webservice“-Schicht. In Java unter anderem mit JAX-WS. Die meisten Sprachen haben Tools für SOAP+WSDL, aber es ist irgendwie beschissen, damit zu arbeiten, besonders auf zeitweise verbundenen Geräten wie Mobiltelefonen.

  • XML-RPC, wenn Sie Schmerz mögen

Es gibt einige Schnellstarts für JAX-RS in den JBoss AS 7 Quickstarts aufführen; Suchen Sie einfach nach "JAX-RS". Die „Küchenspüle " Quickstart ist nützlich, aber vielleicht nicht ideal, wenn Sie mit den Grundlagen von JBoss AS 7 und Jave EE 6 nicht vertraut sind. Für die JAX-RS-Besonderheiten sind Sie mit einem Jersey- oder RESTEasy-Tutorial wie dies oder dies .

Wichtige Überlegungen

Verwenden Sie nach Möglichkeit HTTPs, und wenn der Zugriff nicht öffentlich sein soll, verwenden Sie ein geeignetes HTTP-Authentifizierungsschema wie HTTP Basic auth over HTTPs. Jede anständige Implementierung von Webdiensten bietet Authentifizierungsoptionen oder unterstützt die der Plattform, auf der sie ausgeführt wird. Widerstehen Sie der Versuchung, Ihre eigene Authentifizierung und Benutzerverwaltung auf der Ebene der Webdienste zu implementieren, Sie werden es versauen; Verwenden Sie die bereits geschriebene und getestete Authentifizierung auf der HTTP-Schicht. Dies kann die Verwendung von so etwas wie Apaches mod_auth_pgsql erfordern , die JDBC-Sicherheitsbereiche von JBoss AS 7 usw. Der einzige Fall, in dem ich in Betracht ziehen würde, keine ordnungsgemäße HTTP-Authentifizierung pro Benutzer durchzuführen, ist, wenn ich meine Benutzer aus Sicherheitsgründen nicht trennen muss. Mir ist nur wichtig, dass meine App auf den Server zugreift , dh wenn meine Sicherheitsanforderungen recht schwach sind. In diesem Fall würde ich einen festen Benutzernamen/ein festes Passwort für die gesamte App und möglicherweise ein X.509-Client-Zertifikat verwenden, wenn Android dies unterstützt.

Denken Sie daran, dass, egal wie Sie Dinge sichern, alle Anmeldeinformationen entweder dem Benutzer bekannt sind oder trivial aus einer .apk-Datei extrahiert werden können, sodass Sie immer noch davon ausgehen müssen, dass jeder auf Ihre Webdienstmethoden zugreifen kann, nicht nur auf Ihre App. Schreiben Sie sie entsprechend.

nicht Senden Sie einfach SQL von Ihrer App über einen Webdienstaufruf an den Server und geben Sie die Ergebnisse als JSON zurück. Das ist erschreckend unsicher, sowie hässlich und klobig. Schreiben Sie eine Webdienstmethode für jede einzelne Aufgabe, die die App ausführen soll, und behalten Sie die SQL auf dem Server. Denken Sie daran, parametrisierte Abfragen zu verwenden, und achten Sie auf andere SQL-Injection-Risiken. Diese Webdienstmethoden können eine oder mehrere Abfragen verwenden, um eine einzelne Antwort zu erzeugen – Sie könnten beispielsweise einen „Kunden“-Datensatz und alle zugehörigen „Adresse“- und „Kontakt“-Datensätze sammeln und dann das Ergebnis in einem netten JSON-Objekt an das Android-Gerät zurückgeben verbrauchen können, wodurch zahlreiche langsame und unzuverlässige Netzwerk-Roundtrips eingespart werden.

Unabhängig davon, was Sie verwenden, stellen Sie sicher, dass Sie Ihre Webdienstaufrufe in einem Worker-Thread im Hintergrund ausführen und die Benutzeroberfläche nicht blockieren. Seien Sie auf Zeitüberschreitungen und Fehler sowie auf die Notwendigkeit von Wiederholungen vorbereitet. Testen Sie Ihre App, indem Sie zeitweilige Verbindungsunterbrechungen, hohe Latenzen und hohe Paketverlustraten simulieren, und stellen Sie sicher, dass sie nutzbar bleibt.