Qual è il rischio di SQL injection usando le variabili di binding con una clausola 'like'?

3

Stavo facendo una revisione del codice e ho trovato una query simile a questa:

String sql = "SELECT * FROM users WHERE username LIKE '%' || :userName || '%'";

Vedere la concatenazione di stringhe mi ha fatto fermare e pensare a questo per un po '. A prima vista, questo sembra un po 'rischioso, anche se non ho trovato molte discussioni se non assicurarmi che la variabile di bind sia debitamente scappata.

I commenti su questa domanda su StackOverflow parlano di essere in grado di ottenere più informazioni del previsto o causare un DoS se è non è sfuggito ma non fa necessariamente altri danni.

Nel caso precedente, quando i caratteri jolly e la variabile di binding vengono concatenati e valutati? Poiché i caratteri jolly fanno parte della concatenazione di stringhe, la variabile di bind deve essere valutata prima o dopo la creazione del piano di esecuzione?

In alternativa, i caratteri jolly vengono aggiunti come parte della variabile bind:

String sql = "SELECT * FROM users WHERE username LIKE :userName";
params.addValue("userName", "%" + userName + "%");

Credo che in questo caso il piano di esecuzione venga creato prima che la variabile di bind venga applicata lasciando la variabile non in grado di modificare ciò che viene eseguito (anche se dovrebbe essere ancora scappato). Tuttavia, il primo esempio di cui sopra non sembra abbastanza chiaro. Oltre a fare in modo che la variabile sia opportunamente scappata, c'è qualcosa di cui preoccuparsi?

Altri link che ho visto questa mattina:

posta Dave Rager 23.08.2017 - 17:54
fonte

1 risposta

1

I haven't found much discussion other than making sure the bind variable is properly escaped

Data la sintassi che hai presentato qui, sembra che ": userName" sia una variabile di bind, quindi non dovresti cercare di evitarlo. Se questo è il caso, l'associazione client lo gestirà. Niente di strano qui.

I believe in this case the execution plan is created before the bind variable is applied

Il piano di esecuzione verrà creato per entrambe le query che ci hai mostrato nello stesso punto. Ciò avverrà prima che la variabile bind venga applicata per le istruzioni preparate su serveride e dopo per le istruzioni preparate clientide - diversi DBMS / binding diversi funzionano in modo diverso.

Other than making sure the variable is properly escaped

Se hai stabilito che questa è una variabile di bind, interrompi il tentativo di evitarlo.

    
risposta data 23.08.2017 - 22:46
fonte

Leggi altre domande sui tag