PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come posso interrogare in modo sicuro (indiretto) un database postgresql all'interno di Android?

Versione rapida:

Utilizza un livello intermedio di un servizio Web in esecuzione su un host pubblico che controlli (possibilmente, ma non necessariamente, l'host del database). Esponi i metodi del servizio Web pubblico per eseguire il lavoro limitato che desideri consentire e nient'altro.

Domande correlate:

Opzioni di implementazione

Personalmente userei un server di applicazioni Java come Apache Tomcat o JBoss AS 7 e scriverei i metodi dei miei servizi web utilizzando JAX-RS per produrre una bella API in stile REST da usare per la mia app. Questo è ciò che conosco e funziona bene, ma hai molte opzioni tra cui implementazioni di:

  • API simili a REST (Java's JAX-RS impls Jersey e RESTEasy, vari altri strumenti di lingua) che utilizzano richieste HTTP e producono risposte JSON o XML.

  • SOAP con WSDL, il classico livello "servizio web". In Java fatto con JAX-WS tra le altre opzioni. La maggior parte delle lingue dispone di strumenti per SOAP+WSDL, ma è un po' schifoso da usare soprattutto su dispositivi connessi in modo intermittente come i cellulari.

  • XML-RPC se ti piace il dolore

Ci sono alcuni quickstart JAX-RS sulla Guida rapida di JBoss AS 7 elenco; cerca semplicemente "JAX-RS". La "lavello della cucina " Quickstart è utile, anche se forse non è l'ideale se non hai familiarità con le basi di JBoss AS 7 e Jave EE 6. Per le specifiche JAX-RS ti conviene usare un tutorial Jersey o RESTEasy come questo o questo .

Considerazioni importanti

Utilizzare HTTP se possibile e, se l'accesso non deve essere pubblico, utilizzare uno schema di autenticazione HTTP adatto come l'autenticazione HTTP Basic su HTTP. Qualsiasi implementazione di servizi Web decente offrirà opzioni di autenticazione o supporterà quelle della piattaforma su cui viene eseguita. Evita la tentazione di implementare la tua autenticazione e la gestione degli utenti a livello di servizi web, farai rovinare tutto; usa l'autenticazione al livello HTTP che è già scritto e testato. Ciò potrebbe richiedere l'uso di qualcosa come mod_auth_pgsql di Apache , JDBC di JBoss AS 7, ecc. , cioè se i miei requisiti di sicurezza sono piuttosto deboli. In questo caso userei un nome utente/password fissi per l'intera app e possibilmente un certificato client X.509 se Android li supporta.

Ricorda che, indipendentemente da come proteggi le cose, tutte le credenziali sono note all'utente o possono essere estratte banalmente da un .apk, quindi devi comunque presumere che chiunque possa accedere ai metodi del tuo servizio Web, non solo alla tua app. Scrivili di conseguenza.

non basta inviare SQL dalla tua app tramite una chiamata al servizio Web al server e restituire i risultati come JSON. Questo è terribilmente insicuro, oltre che brutto e goffo. Scrivere un metodo di servizio Web per ogni singola attività che si desidera che l'app sia in grado di eseguire e mantenere l'SQL nel server. Ricordarsi di utilizzare query parametrizzate e fare attenzione ad altri rischi di SQL injection. Questi metodi del servizio Web possono utilizzare una o più query per produrre una singola risposta:ad esempio, potresti raccogliere un record "Cliente" e tutti i record "Indirizzo" e "Contatto" associati, quindi restituire il risultato in un bell'oggetto JSON il dispositivo Android può consumare, risparmiando numerosi viaggi di rete lenti e inaffidabili.

Indipendentemente da ciò che usi, assicurati di eseguire le chiamate al servizio Web in un thread di lavoro in background e di non bloccare l'interfaccia utente. Preparati a timeout ed errori e alla necessità di nuovi tentativi. Testa la tua app simulando la perdita di connessione intermittente, la latenza elevata e gli alti tassi di perdita di pacchetti e assicurati che rimanga utilizzabile.