sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur kan jag säkert (indirekt) fråga en postgresql-databas inom Android?

Snabbversion:

Använd ett webbtjänstmellanlager som körs på en offentlig värd som du kontrollerar (möjligen men inte nödvändigtvis databasvärden). Exponera offentliga webbtjänstmetoder för att göra det begränsade arbete du vill tillåta och inget annat.

Relaterade frågor:

Implementeringsalternativ

Personligen skulle jag använda en Java-applikationsserver som Apache Tomcat eller JBoss AS 7 och jag skulle skriva mina webbtjänstmetoder med JAX-RS att producera ett trevligt REST-stil API för min app att använda. Det är vad jag är bekant med och det fungerar bra, men du har många alternativ inklusive implementeringar av:

  • REST-liknande API:er (Javas JAX-RS innebär Jersey och RESTEasy, olika andra langs-verktyg) som använder HTTP-förfrågningar och producerar JSON- eller XML-svar.

  • SOAP med WSDL, det klassiska "web service" lagret. I Java gjort med JAX-WS bland andra alternativ. De flesta språk har verktyg för SOAP+WSDL men det är lite taskigt att arbeta med, särskilt på intermittent anslutna enheter som mobiler.

  • XML-RPC om du gillar smärta

Det finns några JAX-RS snabbstarterJBoss AS 7 snabbstarter lista; sök bara efter "JAX-RS". " /a> " snabbstart är användbar, men kanske inte idealisk om du inte är bekant med grunderna i JBoss AS 7 och Jave EE 6. Fortfarande med JAX-RS-specifikationerna är du bättre med en Jersey eller RESTEasy handledning som detta eller detta .

Viktigt att tänka på

Använd HTTPs om möjligt, och om åtkomsten inte ska vara offentlig, använd ett lämpligt HTTP-autentiseringsschema som HTTP Basic auth över HTTPs. Varje anständig webbtjänstimplementering kommer att erbjuda autentiseringsalternativ eller stödja alternativen för plattformen som den körs på. Undvik frestelsen att implementera din egen autentisering och användarhantering på webbtjänstlagret, du kommer klanta till det; använd autentiseringen i HTTP-lagret som redan är skrivet och testat. Detta kan kräva användning av något som Apaches mod_auth_pgsql , JBoss AS 7:s JDBC-säkerhetssfärer, etc. Det enda fallet jag skulle överväga att inte göra korrekt HTTP-autentisering per användare är där jag inte behöver separera mina användare av säkerhetsskäl, jag bryr mig bara om att det är min app som kommer åt servern , dvs om mina säkerhetskrav är ganska svaga. I det här fallet skulle jag använda ett fast användarnamn/lösenord för hela appen och eventuellt ett X.509-klientcertifikat om Android stöder dem.

Kom ihåg att oavsett hur du säkrar saker är alla referenser antingen kända för användaren eller kan extraheras trivialt från en .apk så att du fortfarande måste anta att vem som helst kan komma åt dina webbtjänstmetoder, inte bara din app. Skriv dem därefter.

Gör inte skicka bara SQL från din app över ett webbtjänstanrop till servern och returnera resultaten som JSON. Detta är fruktansvärt osäkert, liksom fult och klumpigt. Skriv en webbtjänstmetod för varje enskild uppgift du vill att appen ska kunna utföra och behålla SQL i servern. Kom ihåg att använda parametriserade frågor och var försiktig med andra SQL-injektionsrisker. Dessa webbtjänstmetoder kan använda en eller flera frågor för att producera ett enda svar - till exempel kan du samla in en "Kund"-post och alla tillhörande "Adress"- och "Kontakt"-poster och sedan returnera resultatet i ett snyggt JSON-objekt Android-enheten kan konsumera, vilket sparar många långsamma och opålitliga nätverksresor.

Oavsett vad du använder, se till att göra dina webbtjänstanrop i en arbetstråd i bakgrunden och att inte blockera användargränssnittet. Var beredd på timeouts och fel och på behovet av omförsök. Testa din app genom att simulera intermittent anslutningsförlust, hög latens och höga paketförluster och se till att den förblir användbar.



  1. bilden hämtas inte från databasen med sökväg

  2. COALESCE() Funktion i Oracle

  3. Tidiga registreringar öppnar för PGDay.IT 2011

  4. skapa trädvy looping fråga