Perché i clienti non possono interrogare il DB direttamente usando SQL?

2

Dato che molte delle moderne applicazioni Web consumano solo dati JSON dal sever, che senso ha avere un'API REST invece di usare solo il linguaggio di query SQL?

Al giorno d'oggi le persone stanno iniziando a usare GraphQL. Da quello che capisco è un linguaggio di interrogazione dal client al sever, che poi viene tradotto in query dal sever al database.

Ho capito che non vuoi permettere ai client di eseguire codice arbitrario sul tuo db. Ma perché non puoi semplicemente fare qualcosa come eseguire le query attraverso un utente di database strongmente limitato, con alcuni limiti di velocità e timeout per evitare richieste di spam?

    
posta yawn 14.04.2018 - 02:08
fonte

4 risposte

7

È possibile, ma in generale non è saggio offrire un accesso SQL diretto a un database.

  • Devo rendere il database pubblicamente raggiungibile. Questo da solo mi renderebbe nervoso, poiché aumenta la superficie di attacco e la possibilità di perdita di dati.

Le configurazioni normali terrebbero il DB su una intranet e un server web in un DMZ . Il server web può quindi essere autorizzato per la connessione al DB.

  • Devo impedire accessi non autorizzati o modifiche ai dati e garantire un modello di dati coerente. Nessun utente dovrebbe essere in grado di danneggiare il mio database. Poiché diversi utenti hanno accesso a diversi record, avrei bisogno di creare un account utente di database per utente finale. Potrei dover sviluppare un sistema di viste del database e stored procedure per fare in modo che il modello di dati si adatti a questo modello di autorizzazione.

    Una normale web app controlla il permesso nel codice dell'applicazione Web sul server e, pertanto, non deve limitarsi al modello di autorizzazione del database. Ciò consente modelli di autorizzazione su una granularità più adatta, ad es. concetti di dominio problematici anziché tabelle di database. Un tale schema può essere molto più semplice e quindi più sicuro.

  • Non riesco a limitare le query SQL specifiche che verranno inviate. Le query possono essere scritte in modo subottimale, quindi prestazioni di hogging. A meno che il database non fornisca supporto esplicito, non posso aggiungere cache o limitazione della velocità.

    Al contrario, puoi ottimizzare le query che usi in un server web e utilizzare numerose tecnologie di memorizzazione nella cache.

  • Quando gli utenti si collegano direttamente al DB, il database è diventato la piattaforma dell'applicazione. Ciò rappresenta un sostanziale blocco in una particolare tecnologia e in un particolare modello di dati. Scalare un server di database è anche più difficile rispetto al ridimensionamento dei server delle applicazioni.

    Al contrario, la maggior parte delle applicazioni Web acquisisce una certa scalabilità per impostazione predefinita solo dall'esecuzione del database e di qualsiasi logica applicativa su server diversi.

Se tieni tutto questo in mente, è possibile creare applicazioni incentrate sul database. Questo può essere un buon approccio, ad es. per applicazioni intranet in cui puoi fidarti di tutti gli utenti. Ma a causa dei problemi piuttosto sostanziali, questo non è generalmente consigliabile.

GraphQL è strano perché trasforma il tuo webserver in mezzo server di database. Tuttavia, hai la possibilità di implementare modelli di sicurezza personalizzati, implementare il caching e offrire un'API più conveniente rispetto a SQL non elaborato.

Le API REST "reali" (ad esempio, non GraphQL) sono concettualmente molto semplici e pertanto rendono molto semplice l'implementazione di controlli di sicurezza (probabilmente uno o due if-condizioni per endpoint) e sono molto facili da memorizzare nella cache. Il loro svantaggio (che gli indirizzi GraphQL) è che ottieni spesso più dati del necessario e ottieni solo una singola risorsa per richiesta.

    
risposta data 14.04.2018 - 13:35
fonte
3

Il motivo principale per preferire un'API RESTful rispetto all'accesso SQL diretto è che fornisce un'interfaccia statica a un'implementazione mutevole - l'API non cambia se alcuni dei dati finiscono per essere accessibili tramite il file system o una coda di messaggi. Allo stesso modo, quando devi inevitabilmente aggiornare il database a una versione con modifiche di rottura, nessuno dei client deve cambiare.

Un altro vantaggio è il semplice formato di query / risposta. Confronta cinque minuti per apprendere le basi di JSON per i giorni o le settimane di scrittura di un client di database.

Il controllo degli accessi è un altro grosso problema con i database. Non si tratta solo di chi ha accesso a cosa. Come si scrive una limitazione di frequenza complessa in un database? E come si esprimono controlli di accesso specifici per applicazioni complesse come chi è autorizzato a inviare un messaggio personale a chi? Sono sicuro che è possibile possibile esprimerli in un database, è solo che possono essere molto più facili da esprimere in linguaggi orientati alla programmazione generica.

    
risposta data 14.04.2018 - 04:26
fonte
1

La tua idea sembra interessante, ma ...

Concedere l'accesso SQL è un po 'come consegnare le chiavi dell'auto a un estraneo. Ci sono alcuni problemi con questo:

1) Sicurezza: se è possibile interrogare un database, è possibile creare tabelle, inserire dati, tutti i tipi di cose. Alcuni database hanno funzionalità di sicurezza tali da limitare l'esposizione, ma sarebbe molto impegnativo farlo correttamente e assicurarsi che qualcuno non possa eseguire query su cose a cui non avrebbero dovuto accedere.

2) Negazione del servizio - Sarebbe facile legare un server con un flusso di richieste o di query complesse che lo porterebbero in modo efficace offline

Ci si deve chiedere in che modo graphql possa affrontare queste sfide e al contempo essere sicuro?

    
risposta data 14.04.2018 - 08:48
fonte
1

Prima di tutto, un'API (incluso REST) non è limitata a consumare dati da un database. È un mezzo per richiamare il codice organizzato da qualche applicazione; potrebbe essere correlato al database, ma potrebbe anche eseguire attività non di database, ad es. controlla alcuni attuatori o leggi alcuni dati del sensore o calcola una formula complessa basata sui tuoi input.

Un altro motivo per impedire ai tuoi clienti di accedere direttamente al tuo database è un ulteriore livello di sicurezza; è opinione comune che qualsiasi sistema esposto a un utente finale sia un potenziale exploit; può essere compromesso. E se riesci a compromettere alcuni sistemi che interagiscono direttamente con il tuo database, allora questo è un gioco in sicurezza. Questo aggressore può accedere a dati riservati, può manomettere i dati e può cancellare i dati.

Dal punto di vista della manutenibilità, il disaccoppiamento del database dal client semplificherà la progettazione in modo tale che:

  1. puoi modificare il tuo database senza dover modificare il tuo client
  2. puoi correggere i bug nelle tue query senza modificare il tuo client
  3. puoi modificare la struttura della tabella senza modificare il tuo client
  4. (e un bonus) che è possibile conservare più versioni dei metodi API, per garantire la retrocompatibilità per i client più vecchi.
risposta data 09.11.2018 - 15:40
fonte

Leggi altre domande sui tag