Per un'applicazione che sto pianificando, ho il requisito che l'input provenga da circa 30-50 tabelle di origine del server SQL e deve essere inserito in una tabella di destinazione. Le tabelle di origine hanno una struttura leggermente diversa, ma alla fine, ogni record di destinazione verrebbe da esattamente un record di una delle tabelle di origine. Ci dovrebbe essere una possibilità per gli utenti di specificare per ciascuna tabella di origine e ciascuna colonna di destinazione un'espressione come e. g. case when col1 like 'a%' then 'ABC' else Left(col5 + col6, 10) end
o solo 'xxx'
o col4
.
Un modo semplice per implementare ciò sarebbe semplicemente creare una clausola di selezione dinamica dinamica su una tabella di origine dall'elenco di queste espressioni, quindi lasciare che il motore SQL esegua l'interpretazione dell'espressione. Ciò sarebbe piuttosto flessibile, in quanto più o meno ogni espressione SQL valida sarebbe disponibile per gli utenti. Un'implementazione più complicata sarebbe quella di definire un insieme di espressioni supportate dall'applicazione e creare un parser di espressioni, che interpreti tutte le espressioni e le restituisca nella clausola select
, e quindi avrà ovviamente il pieno controllo del generato SQL. Ma dovremmo anticipare il set di espressioni richiesto.
Naturalmente, se implementato in modo ingenuo, il primo approccio offrirebbe il potenziale per l'iniezione SQL. Ma se creerei un ID utente per tabella di origine che non ha alcuna autorizzazione, tranne selezionare su questa tabella, ed eseguire l'SQL dinamico usando quell'ID utente, non vedo alcun potenziale per l'iniezione SQL riuscita. E anche i messaggi di errore non dovrebbero rivelare nulla di utile per un utente malintenzionato, in quanto le strutture delle tabelle di origine e di destinazione sarebbero comunque note agli utenti. Qualsiasi attacco utile che proverebbe a cambiare qualcosa nel database non sarebbe possibile a causa delle autorizzazioni limitate.
Esiste un potenziale di iniezione SQL con questo approccio che non ho visto?