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: