Tutto ciò che ho visto sugli attacchi SQL injection sembra suggerire che le query parametrizzate, in particolare quelle in stored procedure, sono l'unico modo per proteggersi da tali attacchi. Mentre lavoravo (nel Medioevo) le procedure memorizzate erano considerate come una cattiva pratica, principalmente perché erano considerate meno manutenibili; meno testabile; altamente accoppiato; e ha bloccato un sistema in un unico fornitore; ( questa domanda copre altri motivi).
Sebbene mentre lavoravo, i progetti erano praticamente inconsapevoli della possibilità di simili attacchi; sono state adottate varie regole per proteggere il database dalla corruzione di vari tipi. Queste regole possono essere riassunte come:
- Nessun client / applicazione ha avuto accesso diretto alle tabelle del database.
- Tutti gli accessi a tutte le tabelle erano attraverso le viste (e tutti gli aggiornamenti alle tabelle di base erano fatti tramite i trigger).
- Tutti gli elementi di dati avevano un dominio specificato.
- Nessun elemento di dati è stato ammesso come annullabile: ciò aveva implicazioni che a volte i DBA digrignavano i denti; ma è stato applicato.
- I ruoli e le autorizzazioni sono stati impostati in modo appropriato, ad esempio un ruolo limitato per dare solo alle viste il diritto di modificare i dati.
Quindi è un insieme di regole (applicate) come questa (sebbene non necessariamente questo particolare insieme) un'alternativa appropriata alle query parametrizzate nella prevenzione degli attacchi di SQL injection? Se no, perché no? Un database può essere protetto contro tali attacchi da misure specifiche del database (solo)?
Modifica
L'enfasi della domanda è leggermente cambiata, alla luce delle prime risposte ricevute. Domanda di base invariata.
EDIT2
L'approccio basato su query parametrizzate sembra essere solo un passaggio marginale in difesa dagli attacchi ai sistemi. Mi sembra che le difese più fondamentali siano entrambe auspicabili e possano rendere l'affidamento su tali query non necessarie o meno critiche, persino per difendere specificamente dagli attacchi per iniezione.
L'approccio implicito nella mia domanda era basato sul "blindaggio" del database e non avevo idea se fosse un'opzione praticabile. Ulteriori ricerche hanno suggerito che ci sono tali approcci. Ho trovato le seguenti fonti che forniscono alcuni suggerimenti su questo tipo di approccio:
Le caratteristiche principali che ho preso da queste fonti sono:
- Un ampio dizionario di dati, combinato con un ampio dizionario di dati di sicurezza
- Generazione di trigger, query e vincoli dal dizionario dei dati
- Riduci a icona il codice e massimizza i dati
Mentre le risposte che ho avuto fino ad ora sono molto utili e sottolineano le difficoltà derivanti dall'inosservare le domande parametrizzate, alla fine non rispondono alle mie domande originali (ora enfatizzate in grassetto).