L'iniezione di SQL è un problema di sicurezza molto grave, in gran parte perché è così facile sbagliare: il modo ovvio e intuitivo per creare una query che incorpora l'input dell'utente ti rende vulnerabile e il modo giusto per mitigarlo richiede di conoscere i parametri query e iniezione SQL prima.
Mi sembra che il modo ovvio per risolvere questo sarebbe chiudere l'opzione ovvia (ma sbagliata): correggere il motore di database in modo che qualsiasi query ricevuta che utilizza valori hardcoded nella sua clausola WHERE invece di parametri restituisca un bel descrittivo messaggio di errore che indica di utilizzare invece i parametri. Ciò dovrebbe ovviamente avere un'opzione di opt-out in modo che roba come le query ad hoc dagli strumenti di amministrazione continueranno a funzionare facilmente, ma dovrebbe essere abilitata per impostazione predefinita.
Avere questo chiuderebbe l'iniezione di SQL a freddo, quasi da un giorno all'altro, ma per quanto ne so, nessun RDBMS lo fa davvero. C'è qualche buona ragione perché no?
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC;
"bad"
è veramente letterale o è il risultato della concatenazione di stringhe. Le due soluzioni che vedo sono eliminare SQL e altri DSL incorporati nelle stringhe (sì, per favore) o promuovere linguaggi in cui la concatenazione delle stringhe è più fastidiosa rispetto all'utilizzo di query con parametri (umm, no).
bad_ideas_sql = 'SELECT title FROM idea WHERE idea.status == "bad" AND idea.user == :mwheeler'
avrebbe valori sia codificati sia parametrizzati in una singola query - prova a catturarlo! Penso che ci siano casi d'uso validi per tali query miste.