Tutto ciò che ho visto sugli attacchi di SQL injection sembra suggerire che le query parametrizzate, in particolare quelle nelle procedure memorizzate, sono l'unico modo per proteggersi da tali attacchi. Mentre stavo lavorando (nel Medioevo) le procedure memorizzate erano viste come cattive pratiche, principalmente perché erano considerate meno gestibili; meno testabile; altamente accoppiato; e bloccato un sistema in un fornitore; ( questa domanda copre alcuni altri motivi).
Sebbene quando stavo lavorando, i progetti erano praticamente inconsapevoli della possibilità di tali attacchi; sono state adottate varie regole per proteggere il database dalla corruzione di vario genere. Queste regole possono essere riassunte come:
- Nessun client / applicazione aveva accesso diretto alle tabelle del database.
- Tutti gli accessi a tutte le tabelle sono avvenuti tramite viste (e tutti gli aggiornamenti alle tabelle di base sono stati effettuati tramite trigger).
- Tutti gli elementi di dati avevano un dominio specificato.
- Nessun elemento di dati poteva essere nullo - questo aveva implicazioni che a volte i DBA digrignavano i denti; ma è stato applicato.
- Ruoli e autorizzazioni sono stati impostati in modo appropriato, ad esempio un ruolo limitato per dare alle sole viste il diritto di modificare i dati.
Quindi un insieme di regole (imposte) come questo (sebbene non necessariamente questo particolare insieme) sia un'alternativa appropriata alle query parametrizzate nella prevenzione degli attacchi con iniezione SQL? In caso contrario, perché no? È possibile proteggere un database da tali attacchi mediante misure specifiche (solo) del database?
MODIFICARE
L'enfasi della domanda è leggermente cambiata, alla luce delle risposte iniziali ricevute. Domanda di base invariata.
EDIT2
L'approccio di fare affidamento su query paramaterizzate sembra essere solo un passo periferico nella difesa dagli attacchi ai sistemi. Mi sembra che sia desiderabili difese più fondamentali, e che possano rendere non necessario, o meno critico, affidarsi a tali interrogativi, persino per difendersi specificamente dagli attacchi di iniezione.
L'approccio implicito nella mia domanda si basava sull'armouring 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 per questo tipo di approccio:
http://database-programmer.blogspot.com
http://thehelsinkideclaration.blogspot.com
Le principali caratteristiche che ho preso da queste fonti sono:
- Un vasto dizionario di dati, combinato con un vasto dizionario di dati di sicurezza
- Generazione di trigger, query e vincoli dal dizionario dei dati
- Riduci al minimo il codice e massimizza i dati
Mentre le risposte che ho avuto finora sono molto utili e indicano difficoltà derivanti dall'inosservanza delle query paramaterizzate, alla fine non rispondono alle mie domande originali (ora sottolineate in grassetto).