Esiste un linguaggio di programmazione del database con incapsulamento per prevenire le iniezioni?

5

Una delle cose che mi infastidisce di SQL è che non può pensare in termini di oggetti e la sua mancanza di incapsulamento mi fa costantemente sfuggire comandi per evitare iniezioni.

Voglio un linguaggio di database che possa essere polimorfico e sicuro. Ho cercato online per linguaggi di programmazione di database non procedurali e finora la mia ricerca su google non ha avuto successo.

So che in linguaggi come PHP ci sono modi per prevenire le iniezioni rendendo il PHP incapsulato bene, ma non tutte le situazioni di programmazione del database implicano l'incorporamento della lingua del database in un'altra lingua.

Nelle situazioni in cui è solo la programmazione di database, esiste un linguaggio di programmazione di database orientato agli oggetti in sé? In caso contrario, stanno lavorando su uno?

    
posta DrinkJavaCodeJava 27.12.2012 - 18:59
fonte

1 risposta

17

SQL ha effettivamente l'incapsulamento incorporato nel linguaggio, in particolare nella parte di cui stai parlando, per prevenire l'iniezione. L'idea di base è che se stai sfuggendo alle tue query SQL mentre le sviluppi, stai sbagliando.

Modo sbagliato:

SQL = 'select * from MY_TABLE where NAME = ' + Escape(nameParam);
RunQuery(SQL);

L'interrogazione incapsulata in SQL viene chiamata usando parametri . Sembra qualcosa del genere:

SQL = 'select * from MY_TABLE where NAME = :name';
Params.Add(nameParam);
RunQuery(SQL, Params);

Questo invia i parametri di query al database come qualcosa di separato dalla query stessa, quindi non viene analizzato come parte della stringa, rendendo impossibile l'iniezione. Il motore di database sostituisce il parametro in per il token param ( :name ).

Questo ha anche vantaggi di efficienza. Sul lato client, non è necessario concatenare stringhe e in genere è possibile dichiarare le stringhe SQL come costanti. E sul lato database, il motore DB può memorizzare nella cache una query parametrizzata e utilizzare lo stesso piano di query se lo riutilizzi più volte, rendendo più rapido l'accesso ai dati.

Il modo in cui i parametri funzionano sul lato client varia in modo esatto, in base al database della lingua e alla libreria di accesso DB che stai utilizzando. Guarda la tua documentazione per capire come è fatta. Ma AFAIK supporta tutti i database SQL, quindi non dovresti avere grossi problemi a usarli.

    
risposta data 27.12.2012 - 19:18
fonte

Leggi altre domande sui tag