Che cosa significa Robert C. Martin quando SQL non è necessario? [chiuso]


45

Ho letto / guardato molti contenuti di Robert C. Martin. Mi sono imbattuto in lui dicendo che SQL non è necessario a causa delle unità a stato solido. Quando cerco altre fonti per eseguire il backup, ricevo un mucchio di articoli casuali che descrivono la differenza delle prestazioni SQL tra dischi rigidi e unità a stato solido (che è correlata ma non è ciò che sto cercando di ricercare).

Alla fine, non capisco a cosa stia cercando di arrivare. Sta dicendo sostituire SQL con le tecnologie No-SQL? Sta dicendo archiviare i dati in file in un file system? Oppure vuole semplicemente smettere di usare i database SQL / Relational a causa degli attacchi SQLi? Temo di perdere il punto che sta cercando di chiarire.

Fornirò alcuni link qui in modo che tu possa leggere direttamente dalla sua mente:

  1. Tavoli Bobby
  2. Conferenza sull'architettura pulita

Innanzitutto, afferma che SQL dovrebbe essere rimosso completamente dal sistema.

La soluzione. L'unica soluzione È eliminare completamente SQL dal sistema. Se non esiste un motore SQL, non possono esserci attacchi SQLi.

E anche se parla della sostituzione di SQL con un'API, NON penso che significhi mettere SQL dietro un'API a causa di quella citazione precedente e di ciò che dice prima nell'articolo.

I frame non gestiscono il problema; ...

Nota a margine: nel dire SQL, sono abbastanza sicuro che Robert significhi la maggior parte dei database relazionali. Forse non tutti ma soprattutto. In ogni caso, la maggior parte delle persone utilizza comunque SQL. così...

Se SQL non viene utilizzato per persistere nei dati, cosa dovremmo usare?

Prima di rispondere, dovrei anche notare. Robert sottolinea che le unità a stato solido dovrebbero cambiare gli strumenti che utilizziamo per mantenere i dati. La risposta di Søren D. Ptæus lo sottolinea.

Devo anche rispondere al gruppo "ma integrità dei dati". Su alcune ulteriori ricerche, Robert afferma che dovremmo usare database transazionali come Datomic . Quindi CRUD si trasforma in CR (crea e leggi) e le transazioni SQL scompaiono del tutto. L'integrità dei dati è ovviamente importante.

Non riesco a trovare una domanda che racchiuda tutto questo. Immagino che sto cercando alternative che corrispondano alle linee guida di Robert. Datomic è uno ma è quello? Quali altre opzioni corrispondono a queste linee guida? E funzionano davvero meglio con le unità a stato solido?


5
@ christo8989 - "Cosa significa sostituire SQL con un'API?". Lo interpreto nel senso che non hai un linguaggio di query testuale (che viene passato a un motore SQL) in tutta la tua base di codice. Lo nascondi dietro un'API che espone solo meccanismi sicuri per descrivere le query. All'interno dell'API qualcosa deve generare comandi al motore SQL, ma questa è una superficie più piccola in cui è possibile imporre l'uso dell'associazione di parametri, ecc., Controllare chi apporta le modifiche, ecc.
Andrew

42
Ma, ma, ma ... SQL è un'API. È l'API per un RDBMS. Capita solo di essere un'API molto potente che può essere facilmente utilizzata in modo improprio.
Bart van Ingen Schenau,

25
Se si crea un API DB che non dispone di un'interfaccia testuale, prima o poi qualche povero programmatore avrebbe scritto il codice che assomiglia a questo: eval(request.GET["table_name"] + ".get(pk=" + request.GET["pk"] + ")")). Non è SQL che è davvero in colpa, ma programmatori poveri e ignoranti.
Lie Ryan,

6
@JimmyJames SQL è un linguaggio sì, ma ciò non significa che non sia un'API. SQL è un linguaggio che fornisce un'API per accedere ad alcuni archivi sottostanti.
Cubico,

5
@nocomprende SQL è sempre stato progettato per essere utilizzato per le applicazioni. Altrimenti sarebbe stato praticamente inutile. Il punto era sempre quello di dare alle applicazioni un modo per archiviare e recuperare i dati senza fare confusione con strani formati personalizzati o anche preoccuparsi molto di come i dati sono archiviati.
Cubico,

Risposte:


74

Bob Martin sta chiaramente esagerando per rendere più chiaro il suo punto. Ma qual è il suo punto?

Vuole solo che le persone smettano di usare i database SQL / Relational a causa degli attacchi SQLi?

Per quanto ne so, in quel post sul blog (il tuo primo link) Martin cerca di convincere le persone a smettere di usare SQL, ma non i database relazionali. Queste sono due cose diverse .

SQL è un linguaggio estremamente potente ed è standardizzato in una certa misura. Permette di creare query e comandi complessi in modo molto compatto, in modo leggibile, comprensibile, facile da imparare. Non dipende da un altro linguaggio di programmazione, quindi è utilizzabile per la maggior parte dei programmatori di applicazioni, indipendentemente dal fatto che preferiscano Java, C, C ++, C #, Python, Ruby, JavaScript, Basic, Go, Perl, PHP o qualcos'altro.

Tuttavia, questo potere ha un costo : scrivere query / comandi SQL sicuri è più difficile che scrivere quelli non sicuri. Un'API sicura dovrebbe facilitare la creazione di query sicure "per impostazione predefinita". Quelli potenzialmente non sicuri dovrebbero aver bisogno di più sforzi mentali o almeno più di battitura. Questo è l'IMHO per cui Martin sta sfidando SQL nella sua forma attuale.

Il problema non è nuovo e esistono API più sicure rispetto allo standard SQL per accedere a un database relazionale. Ad esempio, tutti i mappatori OR che conosco stanno cercando di fornire tale API (anche se in genere sono progettati per altri obiettivi primari). Le varianti SQL statiche rendono difficile la creazione di query dinamiche con dati di input non dinamici (e non si tratta di una nuova invenzione: SQL incorporato, che utilizza spesso SQL statico, ha circa 30 anni).

Sfortunatamente, non sono a conoscenza di alcuna API flessibile, standardizzata, matura, indipendente dalla lingua e potente come SQL, in particolare SQL dinamico. Ecco perché ho qualche dubbio sul suggerimento di Martin di "non usare SQL" come un modo realistico di risolvere i problemi citati. Quindi leggi il suo articolo come un pensiero nella giusta direzione, non come una "best practice" che puoi seguire alla cieca da domani in poi.


2
Almeno possiamo evitare di usarlo per qualsiasi operazione di scrittura di solito con ciò che le cose simili a ORM forniscono. Per quanto riguarda l'interrogazione del database, puoi già fare alcune cose senza scrivere il tuo SQL. Oggi solo l'uso "avanzato" delle capabitilie del database dovrebbe richiedere la scrittura di SQL o l'uso di tipi di dati complessi (grafico, dati geografici, ricorsivi).
Walfrat,

7
Martin sostiene specificamente che l'API da utilizzare non dovrebbe essere potente come SQL; La sua tesi secondo cui la potenza di SQL è il problema, non una caratteristica. L'API per cui sta sostenendo dovrebbe essere specifica per l'applicazione e deve essere flessibile e potente solo quanto l'applicazione ha assolutamente bisogno, non di più. Sta specificamente discutendo di non inventare un altro linguaggio di query basato su stringhe.
Cubico,

3
@Cubic: qualsiasi soluzione ai problemi menzionati da Martin probabilmente deve essere meno potente o meno facile da usare rispetto a SQL: questa è la loro benedizione e la loro maledizione.
Doc Brown,

1
@Barmar: SQL è il più alto livello possibile e Bob afferma che è palesemente pericoloso.
Robert Harvey,

3
@ christo8989: Non credo abbia molto senso provare a scrivere una risposta come risposta a tutto ciò che Martin ha scritto o detto una volta nella sua carriera. La mia risposta è stata una alla domanda posta nel tuo titolo, spiegando principalmente come il post sul blog nel primo link che hai dato dovrebbe essere interpretato da IMHO.
Doc Brown,

57

L'opinione di Bob Martin è proprio questo; l'opinione di un uomo.

Un programmatore dovrebbe comprendere il sistema che sta scrivendo abbastanza bene da esercitare una ragionevole cura della sua sicurezza e delle sue prestazioni. Ciò significa che, se stai parlando con un database SQL, fai quello che dice il sito Web Bobby Tables : disinfetta i tuoi dati di input. Ciò significa che il database SQL viene inserito in un computer che promette prestazioni adeguate. Esistono modi molto noti e ben compresi per fare queste cose, e sebbene non garantiscano la sicurezza assoluta o le prestazioni ideali, nient'altro.

L'affermazione che non abbiamo più bisogno di SQL perché ora abbiamo SSD è solo speciosa. SQL non è stato inventato perché i dischi rigidi ad alta velocità non esistevano ancora; è stato inventato perché avevamo bisogno di un modo standard per esprimere concetti di recupero dei dati. I sistemi di database relazionali hanno molte altre qualità oltre alla velocità e alla sicurezza che li rendono ideali per le operazioni aziendali; in particolare, ACID . L'integrità dei dati è importante almeno quanto la velocità o la sicurezza e, se non li possiedi, qual è il punto di proteggere i dati errati o recuperarli il più rapidamente possibile?

Prima di prendere l'isteria di un uomo come vangelo, ti suggerisco di conoscere la sicurezza e le prestazioni dell'applicazione e del sistema alle loro condizioni, non leggendo articoli casuali su Internet. C'è molto di più in termini di sicurezza, prestazioni e progettazione di sistemi robusti oltre al semplice "evitare questa tecnologia".

Non vietiamo i coltelli da cucina perché alcuni sfortunati riescono a tagliarsi accidentalmente le dita con loro.


16
Non interpreto gli articoli di Martin come sostenitori dell'abbandono di RDBMS, ma piuttosto di utilizzare modi alternativi di interagire con essi, ad esempio LINQ-to-SQL o l'API JPA Criteria, piuttosto che codificare o manipolare direttamente le stringhe SQL nel nostro codice sorgente.
Jules,

27
Quindi non dovremmo seguire ciecamente quello che dice ... ma cosa sta dicendo ?
TRiG,

33
Una cosa che non mi piace della comunità qui è, non appena fai una domanda su come fare qualcosa come Clean Code / Uncle Bob -way , sono le persone che ti spiegano come dovresti fare qualcosa di diverso . "Come dipingere come van Gogh?" - "Van Gogh aveva torto, invece dovresti dipingere come Picasso".
R. Schmitz,

21
la sanificazione dei dati di input per evitare attacchi di iniezione dovrebbe essere l'opzione di backup dopo aver utilizzato metodi parametrizzati per separare il codice dall'input.
maniaco del cricchetto

17
Tutta la tecnologia è condannata e sostanzialmente imperfetta. È solo una questione di tempo. Nel frattempo, abbiamo cose che dobbiamo fare, con le nostre tecnologie imperfette e condannate.

15

Cosa sta realmente dicendo?

Sta dicendo sostituire SQL con le tecnologie No-SQL?

TL; DR: Sì (sorta di)

In un discorso più recente di quello a cui ti sei collegato sostanzialmente sullo stesso argomento, dice: "Il database è un dettaglio. Perché abbiamo database?" .

Afferma che il database è nato per rendere più facile l'accesso ai dati dai dischi rotanti, ma in futuro "[...] non ci saranno dischi" grazie alla nuova tecnologia e a ciò che chiama "RAM persistente" e che sarà più facile memorizzare i dati utilizzando le strutture utilizzate dai programmatori, come hashtable o alberi.

Continua predicendo che i database relazionali nel loro insieme scompariranno in gran parte a causa della loro nuova concorrenza:

Se fossi Oracle, sarei piuttosto spaventato perché la ragione della mia esistenza sta evaporando da sotto di me. [...] La ragione per l'esistenza del database sta scomparendo.

Probabilmente ci saranno alcuni tavoli relazionali che sopravviveranno, ma ora c'è una sana competizione .

Quindi no, per lui non si tratta solo di SQL injection, anche se lui ritiene che SQL sia intrinsecamente imperfetto in questo senso .


Nota dell'autore:

Le dichiarazioni in questo post sono solo citazioni per comprendere l'opinione di Robert C. Martin su questo argomento e non rappresentano l'opinione dell'autore. Per un punto di vista più differenziato, vedi la risposta di Robert Harvey .


2
Apparentemente, la "RAM persistente" risolve solo l'uso dei database per la serializzazione dello stato corrente dell'applicazione, senza tener conto della compatibilità con le versioni precedenti o precedenti. Certo, alcuni database vengono usati in questo modo ma non tutti (non mi rendo conto che Martin sta dicendo questo, non tu).
Cubico,

7
Quindi Martin sta effettivamente dicendo che l'unico punto dei database è l'astrazione su una memorizzazione lenta? Wow. Quindi questo supporta la risposta di Robert Harvey: la sua opinione dovrebbe essere presa con un enorme granello di sale. Ad esempio, questo punto di vista non considera che il valore di un DB mantenga un modello di dati coerente e persistente. La sua idea di strutture di dati nella "RAM persistente" (SSD?) È sia lenta che apre la possibilità di perdita di dati, anche i DB NoSQL usano spesso journaling e strutture di dati immutabili per aggiornare in modo sicuro i record persistenti.
amon,

3
@amon Sì, Robert Harvey ha ragione offrendo un punto di vista più differenziato. Ma dal momento che l'OP ha chiesto in particolare cosa Robert C. Martin provasse a dire, ho trascritto parte del suo discorso "più recente".
Søren D. Ptæus,

3
@amon - vedi la prima frase della risposta di Doc Brown sopra. Martin fa spesso dichiarazioni che sono enormi esagerazioni del suo punto al fine di farcela. Non significa che tutte le operazioni di database possano essere sostituite da archivi in ​​memoria, non più di quanto significhi semplicemente avere un componente dell'applicazione che tocchi SQL in qualche modo è un rischio di sicurezza abbastanza grande che dovrebbe essere evitato in tutti casi, eppure a dispetto delle sue parole può essere interpretato nel dire ciò. Ma tutto ciò che sta davvero cercando di fare è far fermare tutti e pensare: SQL / RDBMS è adatto alla mia applicazione?
Jules,

12
@Jules Capisco che spesso esagera. Ma data la sua portata e reputazione, è del tutto inutile che "Zio Bob" non chiarisca quando sta esagerando e dove sta effettivamente dicendo cosa intende. Se dovrebbe insegnare qualcosa, non è possibile ripensare e reinterpretare tutto ciò che dice fino a quando non ha alcun senso , soprattutto perché non riflette o critica da solo le sue idee. Ad un certo punto, è più facile dire "non ascoltarlo", o addirittura: zio Bob considerato dannoso .
amon,

11

SQL è un dettaglio. La conoscenza di un dettaglio non dovrebbe diffondersi.

Man mano che SQL viene utilizzato in sempre più posizioni nel codice, il codice diventa sempre più dipendente da esso.

Man mano che apprendi sempre più trucchi SQL, risolvi sempre più problemi utilizzando SQL. Ciò significa che il passaggio a un'altra API per persistere implica molto di più della semplice traduzione. Devi risolvere problemi che non ti rendevi conto di avere.

Ti imbatti in questo passaggio anche tra i database. Uno offre la fantastica funzione whizzbang 5, quindi la usi in diversi punti solo per scoprire che la caratteristica whizzbang 5 è proprietaria e ora hai un problema di licenza che costerà un sacco di soldi. Quindi fai molto lavoro scavando ovunque hai usato la funzione 5 e risolvendo il problema da solo solo per scoprire in seguito che stai usando anche la funzione whizzbang 3.

Una delle cose che rende Java così portatile è che alcune funzionalità della CPU non sono disponibili. Se fossero disponibili li userei. E improvvisamente ci sono CPU su cui il mio codice Java non funzionerà perché non hanno quelle funzionalità. È lo stesso con le funzionalità del database.

È facile sacrificare la tua indipendenza senza accorgertene. SQL è una scelta non un dato. Se decidi di usare SQL, fallo in un unico posto. Fallo in un modo che può essere disfatto.

Il fatto che SQL abbia problemi di sicurezza e che stiamo passando a modelli di memoria persistenti non significa che SQL sia condannato. Porta a casa il punto in cui è una scelta. Se vuoi preservare il diritto di fare quella scelta devi fare il lavoro.


Vale la pena notare che il movimento di database degli anni '80 e lo zio Bob hanno una storia piuttosto brutta. Ha avuto tutti i suoi problemi risolti con un file system semplice quando la gestione ha costretto un amministratore di database nella sua vita. Questo evento lo ha spinto nella sua carriera di consulenza stellare. (Racconta questa storia in uno dei suoi primi libri chiari, dimentica quale) Sa come risolvere i problemi senza DB e ha poca pazienza per coloro che si comportano come se li usassero è un dato di fatto.

Racconta anche una storia su come rimandare l'aggiunta di un DB a un'applicazione fino all'ultimo minuto quando un cliente lo ha richiesto e lo ha aggiunto in un giorno come funzionalità opzionale. La mia ipotesi è che vede come la maggior parte di noi usa i DB come dipendenza. Sta cercando di mostrarci come liberarci dall'abitudine.


1
Accidenti, Einstein, ovviamente.

1
Ah, non sapevo che Einstein conosceva Bob. O quel Bob era Dio. Anche se suona come se avesse un aspetto divertente.
candied_orange,

9
@nocomprende stai vivendo una dieta costante di poster motivazionali?
candied_orange,

2
Ma Bob è Dio. Almeno per alcuni.
Peter Mortensen,

3
Mi rifiuto di credere che Dio sia così bravo a parlare in pubblico.
candied_orange,

5

La citazione dalla tua prima citazione è (enfasi mia),

La soluzione. L'unica soluzione È eliminare completamente SQL dal sistema . Se non esiste un motore SQL, non possono esserci attacchi SQLi.

Cosa sostituirebbe SQL? Un'API ovviamente! E NON un'API che utilizza un linguaggio testuale. Invece, un'API che utilizza un set appropriato di strutture dati e chiamate di funzioni per accedere ai dati necessari.

Il rant è contrario a consentire ai programmatori di applicazioni di utilizzare SQL.

La soluzione suggerita è quella di consentire loro di utilizzare invece un'API: che non è SQL e non consente l'iniezione.

IMO, esempi di tali API potrebbero includere:

  • http://bobby-tables.com/csharp suggerisce che i programmatori C # possono usare l'API ADO.NET.

    Questo non è un esempio perfetto perché ADO.NET è un'API ampia o profonda (ovvero potente o generica), che consente anche ai suoi utenti di inserire SQL raw (o raw-ish).

  • Alcuni sviluppatori SQL o amministratori di database suggeriscono che un database dovrebbe essere configurato in modo tale da consentire l'accesso solo tramite (un numero limitato di procedure memorizzate per iscritto) e che agli sviluppatori di applicazioni non dovrebbe essere consentito di scrivere le proprie (pericolose) query SQL

  • Un altro modo per "eliminare SQL dal sistema" è di mettere il database (che espone SQL) su qualche altro sistema, a cui si accede tramite un'API REST o simile.

Quindi, IMO, la soluzione globale o i sistemi possono ancora usare un database (specialmente dato che un motore di database implementa utili proprietà ACID, si ridimensiona bene e così via, potrebbe essere sciocco provare a fare a meno di uno o scrivere uno specifico per l'applicazione).

I requisiti del rant sono soddisfatti se l'API SQL del database è nascosta agli sviluppatori dell'applicazione, dietro qualche altra API (ad esempio ADO, forse un ORM, un servizio Web o altro).

Più in generale suppongo significhi avere un DAL specifico per l'applicazione (un "livello di accesso ai dati" o "livello di astrazione del database"). Un DAL isola l'applicazione dai dettagli di come e dove i dati vengono archiviati e / o recuperati. Il DAL può o non può essere implementato utilizzando un database SQL.


Ho lavorato su un prodotto che ha fatto esattamente questo 30 anni fa. E il database sottostante non supportava nemmeno SQL (ancora). E, il set di tabelle correlate è stato memorizzato in (attendere ...) un database. Il ragazzo che ne è uscito era davvero intelligente. Tuttavia non è più un programmatore.

Mi piace questa risposta, ma penso che potrebbe non dirlo. Inoltre afferma "I frame non gestiscono il problema ...". Dalla tua risposta, sembra che tu stia dicendo che usare Linq-to-Sql è ok ma non è un framework che gestisce il problema?
christo8989,

@ christo8989 Non lo so. Cita Hibernate come esempio di un framework che non gestirà il problema. E in effetti OWASP dice : "Hibernate non garantisce l'immunità a SQL Injection, si può usare impropriamente l'API a loro piacimento. Non c'è nulla di speciale su HQL (sottoinsieme Hibernates di SQL) che lo rende più o meno suscettibile." Considerando che alcune delle API che ho citato sarebbero isolatori migliori, non esponendo affatto SQL. Forse Hibernate è qualcosa che potresti usare per implementare un DAL (ma non è esso stesso un DAL completamente isolante).
ChrisW,

1
@ christo8989 augustl.com/blog/2016/… suggerisce che Datomic è (solo) un altro wrapper / layer attorno a un database (possibilmente SQL) - "Datomic non scrive direttamente nel file system. Invece, puoi usare un numero di diversi database come back-end di archiviazione per Datomic: qualsiasi database JDBC SQL, ecc. "
ChrisW,

Va notato che la soluzione per evitare l'iniezione di SQL in ADO.NET non è poi così complicata: utilizzare i segnaposto nell'SQL, utilizzare i parametri nel comando e impostare il valore di tali parametri.
Zev Spitz,

3

Tutti sembrano rispondere a questa domanda dal punto di vista della sicurezza o con un obiettivo SQL.

Ho visto una lezione di Robert Martin in cui racconta che come programmatori, usiamo molte diverse strutture di dati che sono ottimali per i nostri programmi specifici. Pertanto, anziché archiviare universalmente tutti i dati in una struttura tabulare, dovremmo archiviare i nostri dati in tabelle hash, alberi, ecc. In modo da poter acquisire i dati e passare direttamente al programma.

Ho interpretato il suo messaggio come solo dicendo che dovremmo eliminare per un momento le nostre attuali ipotesi sull'archiviazione persistente per considerare altre possibilità future oltre all'antico formato tabulare SQL. SSD è una soluzione candidata, ma non l'unica.


Cosa potrebbe pensare della lettura / scrittura simultanea multiutente dei dati?
ChrisW,

1
@ChrisW Non penso che questo sia un problema di implementazione, piuttosto un'idea di alto livello per trovare un modo per migliorare la memorizzazione persistente dei dati.
Keenan,

@ChrisW Parla anche di database transazionali. Mettere la tecnologia di controllo del codice sorgente come strumento di persistenza. In questo, crei e leggi solo che è molto più amichevole rispetto a transazioni e aggiornamenti.
christo8989,

@Keenan Quindi non sta davvero offrendo una soluzione tramite l'implementazione. Sta solo dicendo: pensi a cosa potrebbe essere?
christo8989,

1
@ christo8989 Non so se abbia guidato personalmente lo sviluppo di soluzioni candidate per il persistente problema di archiviazione nell'informatica. Ciò non rientra nell'ambito della domanda del PO. Lo zio Bob si occupa dell'architettura dei plug-in. L'attuale standard industriale di sviluppo delle applicazioni è strettamente accoppiato a un database e costruendo l'applicazione attorno ad esso, l'app dipende dal db, quando il db dovrebbe dipendere dall'app. Piuttosto, lo zio Bob propone che "il database è un dettaglio" e dovrebbe essere disaccoppiato e sostituibile.
Keenan,

2

In realtà, non deve usare database e SQL - in modo abbastanza esplicito. Il primo riferimento è un problema ben noto, il secondo riferimento viene fuori suonando come un rant. Anche se lo sto interpretando come un buon motivo per usare i database e non usare SQL. Dal mio punto di vista, questo non è nemmeno un consiglio ragionevole.

Sfortunatamente, l'esempio che sta usando è un esempio ben noto con una soluzione ben nota che poi sottolinea. Di solito si verifica quando un programmatore non si rende conto di ciò che sta facendo. Ad esempio la costruzione di stringhe contenenti SQL come:

    my $sql="select a from b where a=$ui_val;";
    prepare($sql)
    execute($sql)

al contrario di

    my $sql="select a from b where a=?;";
    prepare($sql)
    execute($sql,$ui_val);

Questo è un DBI perl come esempio per il codice ruby ​​on rails. Il codice delle rotaie che fornisce è facile da confondere tra il sicuro e il non sicuro. Come molti ORM nasconde ciò che è sotto l'SQL e così spesso hai a che fare con un'interfaccia che costruisce ed esegue sql per te. Non sembra quasi quello che un'API farebbe per te?

La mia interpretazione del primo riferimento è che sta suggerendo che dovremmo sostituire un problema ben noto che ha una soluzione ben nota.

È anche un peccato che non menzioni che se fatto correttamente renderà il codice più facile da scrivere e più leggibile, sebbene se fatto bene, potrebbe effettivamente essere più difficile da scrivere e meno leggibile. Inoltre, non menziona il fatto che SQL è davvero molto facile da leggere e fa quello che generalmente ti aspetteresti.

È parzialmente corretto, alla fine avremo una memoria infinitamente grande e veloce e un processore infinitamente veloce. Fino a quando non usciremo dalla fisica attuale che limita il calcolo, non è corretto.

Sì, i dischi rotanti appartengono al passato e ora utilizziamo SSD. I dischi funzionano con circa ~ 10 millisecondi per trasferimento di dati, gli SSD funzionano con ~ 0,5 millisecondi (500 microsec) di tempo di accesso ai dati. La RAM è nell'ordine di 100 nano secondi, i processori funzionano su 100 secondi di pico secondi. Questo è il cuore del motivo per cui abbiamo bisogno di database. I database gestiscono il trasferimento di dati tra dischi rotanti o SSD con memoria principale. L'avvento degli SSD non ha eliminato la necessità di database.


4
"STOP USARE SQL" (citato dal primo link) suona molto come se stesse dicendo di non usare SQL, per quanto ne so.
Doc Brown,

6
È un problema di ordine delle parole. In realtà questo era originariamente un telegramma: USANDO SQL STOP

6
@nocomprende Quindi stai dicendo che è vittima di una condizione di gara? Bene, oops. Avrebbe potuto evitarlo usando le transazioni SQL.
Konrad Rudolph,

Forse è una miscela molto breve di Visual Basic e Fortran. Dove finirà tutto?

1
@KonradRudolph: Beh, penso che saremmo d'accordo che praticamente nessuno utilizzerà TSX direttamente dall'assemblaggio. Ci saranno astrazioni di livello superiore. Queste transazioni astratte saranno transazioni SQL? Penso di no. Come linguaggio interpretato, SQL comporta un sovraccarico di prestazioni. Non importava davvero quando si accedeva ai dati sui dischi rigidi rotanti. Non è tuttavia conveniente quando si accede ai dati nella RAM.
Salterio il

2

Risposta

vuole solo che le persone smettano di usare i database SQL / Relational a causa degli attacchi SQLi?

L'articolo "Tabelle Bobby" sembra suggerire che questo, di per sé, è un motivo per non usare SQL:

La soluzione. L'unica soluzione È eliminare completamente SQL dal sistema. Se non esiste un motore SQL, non possono esserci attacchi SQLi.

Potrebbe avere altre ragioni di cui parla altrove. Non lo saprei perché non leggo molto della sua roba.

Digressione

Questa parte non è in realtà una risposta, ma penso che la domanda sul valore di SQL sia molto più interessante (come fanno gli altri, a quanto pare).

Ho avuto molta esperienza nell'uso di SQL e penso di avere una buona comprensione dei suoi punti di forza e di debolezza. La mia sensazione personale è che è stato abusato e abusato, ma l'idea che non dovremmo mai usarlo è un po 'sciocca. L'idea che dobbiamo scegliere "SQL always" o "SQL never" è una falsa dicotomia.

Per quanto l'iniezione di SQL sia un argomento per non usare SQL, è ridicolo. Questo è un problema ben compreso con una soluzione piuttosto semplice. Il problema con questo argomento è che SQLi non è l'unica vulnerabilità esistente. Se ritieni che l'utilizzo delle API JSON ti renda sicuro, avrai una grande sorpresa.

Penso che ogni sviluppatore dovrebbe guardare questo video dal titolo "Venerdì 13: Attacking JSON - Alvaro Muñoz & Oleksandr Mirosh - AppSecUSA 2017"

Se non hai il tempo o la propensione a controllarlo, ecco l'essenza: molte librerie di deserializzazione JSON hanno vulnerabilità legate all'esecuzione di codice in modalità remota. Se stai usando XML, devi preoccuparti ancora di più. Il divieto di SQL dalla tua architettura non renderà sicuro il tuo sistema.


Nessuno ha affermato che il divieto di SQL renderebbe di per sé sicuro il sistema. Lo zio Bob afferma che rende il tuo sistema più sicuro e dato che l'iniezione di SQL rimane il rischio più grande nella sicurezza delle applicazioni web da oltre un decennio, penso che non dovresti respingere leggermente la necessità per l'industria di migliorare il modo in cui parla ai database .
meriton - in sciopero il

@meriton Siamo spiacenti, ma "soluzione, l'unica soluzione" sembra abbastanza chiara. La soluzione al problema di SQLi è nota e abbastanza semplice. Le persone che non possono essere disturbate usano le istruzioni di preparazione creeranno sistemi non sicuri indipendentemente dal fatto che smettano di usare SQL. Queste sono persone non professionali che devono iniziare a seguire le buone pratiche di base o ottenere un nuovo lavoro.
JimmyJames,

2

Voglio affrontare solo una breve dichiarazione:

Oppure vuole semplicemente smettere di usare i database SQL / Relational a causa degli attacchi SQLi?

No. Questa è un'ipotesi sbagliata. Non possiamo dire che dobbiamo smettere di usare le auto, perché sono responsabili delle persone che muoiono in incidenti stradali. Allo stesso modo, i database SQL / relazionali (o qualsiasi altra cosa in questo contesto, come RDBMS) non sono responsabili del payload SQL dannoso che un utente malintenzionato può eseguire sull'applicazione Web. Sono sicuro che l'autore non intendeva questo, perché a questo scopo esiste un intero cheat sheet sulla prevenzione dell'iniezione SQL .


2
Le auto automatizzate eviterebbero circa il 98% degli incidenti stradali. Abbiamo bisogno di avere fiducia la macchina più , eh eh eh.

3
"Non possiamo dire che dobbiamo smettere di usare le auto [tranne per circostanze speciali e / o attentamente controllate] perché sono responsabili delle persone che muoiono in incidenti stradali." - Uhm. Possiamo assolutamente dirlo. E molte persone ragionevoli lo fanno.
Konrad Rudolph,

1
In pratica stai dicendo: un'applicazione sviluppata in Java è stata hackerata, quindi dobbiamo smettere di usare Java . Il downvoting è sufficiente e per il resto, non sono qui per insegnarti il ​​buonsenso. @KonradRudolph
Billal Begueradj,

2
@BillalBEGUERADJ Questa è un'equivalenza un po 'falsa (dal momento che nulla è al sicuro dagli hacker) ma non è nemmeno completamente lontana: ci sono lingue che, a conti fatti, non dovrebbero essere usate perché ci sono alternative migliori; per esempio, se stai usando C al di fuori del contesto della programmazione del sistema, stai sbagliando. Ad ogni modo, non ho votato in modo negativo la tua risposta ma è sbagliata: perché contrariamente a quanto asserisci, è esattamente quello che dice Bob Martin (come mostrano altre risposte).
Konrad Rudolph,

2

Il problema di Martin sembra essere con i programmatori che creano SQL dinamico direttamente dall'input dell'utente, qualcosa del tipo (perdonami, sono principalmente un programmatore C e C ++):

sprintf( query, "select foo from bar where %s;", user_input );

che è assolutamente una ricetta per il bruciore di stomaco (da qui la striscia di Bobby Tables ). Qualsiasi programmatore che inserisce codice del genere in un sistema di produzione merita un paddlin '.

È possibile mitigare (se non eliminare del tutto) il problema utilizzando istruzioni preparate e disinfettando correttamente i dati immessi. Se riesci a nascondere l'SQL dietro un'API in modo tale che i programmatori non stiano costruendo direttamente stringhe di query, tanto meglio (che fa parte di ciò che sostiene Martin).

Ma per quanto riguarda eliminare completamente SQL, non penso che sia pratico o desiderabile. I modelli relazionali sono utili , ecco perché esistono in primo luogo e SQL è probabilmente la migliore interfaccia per lavorare con i modelli relazionali.

Come sempre, si tratta di utilizzare lo strumento giusto per il lavoro. Se l'app del carrello non necessita di un modello relazionale completo, non utilizzare un modello relazionale (ciò significa che non sarà necessario utilizzare SQL). Per le volte in cui hai bisogno di un modello relazionale, allora quasi sicuramente lavorerai con SQL.


Sebbene sprintfnon contenga il tipo di sanificazione richiesto da SQL, le funzioni progettate appositamente per questo scopo lo fanno e sono perfettamente sicure. Esempio: SqlQuery in Entity Framework .
Robert Harvey,

@RobertHarvey: Suppongo che sia il caso. Da parte mia, lavoro principalmente sul lato server in C e C ++, quindi vedo ancora occasionalmente vedere esempi (per fortuna rari) di persone che sprintfusano solo SQL dinamico, che non è come lo fai.
John Bode,

1

Le due fonti che colleghi trasmettono messaggi diversi:

Il post sul blog afferma che la logica di accesso ai dati non dovrebbe esistere come testo in fase di esecuzione, per timore che non sia mescolata con input dell'utente non attendibile. Cioè, il post sul blog condanna la scrittura di query concatenando stringhe.

La lezione è diversa. La prima differenza è nel tono: la lezione specula e mette in discussione, ma non condanna. Non dice che i database sono cattivi, ma ci sfida a immaginare la persistenza senza un database. Sostiene che nei 30 anni trascorsi dalla diffusione dei database relazionali molte cose sono cambiate, e ne evidenzia due che potrebbero influenzare la nostra scelta di tecnologia di persistenza:

  • lo spazio di archiviazione è aumentato di un fattore di circa 1 milione - a prezzi comparabili! Di conseguenza, è meno necessario conservare l'archiviazione e, in particolare, non è più necessario eliminarlo. Utilizzando l'archiviazione solo append, il controllo della concorrenza può essere semplificato perché i blocchi di lettura non sono necessari. Ciò può ovviare alla necessità di transazioni.
  • i tempi di accesso sono diminuiti, poiché la maggior parte dei set di dati ora si inserisce nella RAM, riducendo notevolmente la latenza di lettura.

Queste mutate circostanze cambiano la tecnologia di persistenza ottimale? È interessante notare che lo zio Bob non dice - presumibilmente perché non ritiene che una risposta sia corretta per tutti i programmi. Ecco perché ci mette in guardia nel considerare la nostra scelta della tecnologia di persistenza come un dettaglio piuttosto che incorporarla in tavolette di pietra e trasmetterla come saggezza ricevuta ai nostri pari.

Esistono alternative?

La scrittura della logica di accesso ai dati senza stringhe è del tutto possibile. In Java land, è possibile utilizzare QueryDSL , in cui le query sono descritte utilizzando un'API fluida di tipo sicuro generata dallo schema del database. Tale query potrebbe apparire come segue:

JPAQuery<?> query = new JPAQuery<Void>(entityManager);
Customer bob = query.select(customer)
  .from(customer)
  .where(customer.firstName.eq("Bob"))
  .fetchOne();

Come puoi vedere, la logica della query non è espressa come una stringa, separando chiaramente la struttura attendibile della query dai parametri non attendibili (e, naturalmente, QueryDSL non include mai i parametri nel testo della query, ma utilizza istruzioni preparate per separare la query per i suoi parametri a livello JDBC). Per ottenere l'iniezione SQL con QueryDSL, dovresti scrivere il tuo parser per analizzare una stringa e tradurla in un albero di sintassi e, anche se lo facessi, probabilmente non aggiungeresti supporto per cose brutte come select ... into file. In breve, QueryDSL rende praticamente impossibile l'iniezione di SQL e migliora anche la produttività del programmatore e aumenta la sicurezza del refactoring. Impedito il maggior rischio per la sicurezza delle applicazioni Web, che esiste da abbastanza tempo per generare gag in esecuzionee aumentato la produttività degli sviluppatori? Oserei dire che se scrivi ancora query come stringhe, stai sbagliando.

Per quanto riguarda le alternative alle basi di dati relazionali, è curioso sapere che il controllo della concorrenza multi versione di postgres è esattamente quel tipo di struttura di dati di sola aggiunta di cui parla lo zio Bob, anche se probabilmente stava pensando di più agli archivi di eventi e al reperimento di eventi modello in generale, che si adatta bene anche all'idea di mantenere lo stato corrente nella RAM.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.