Wstrzykiwanie SQL jest bardzo poważnym problemem bezpieczeństwa, w dużej mierze dlatego, że tak łatwo go pomylić: oczywisty, intuicyjny sposób budowania zapytania zawierającego dane wejściowe użytkownika naraża cię na niebezpieczeństwo, a właściwy sposób jego złagodzenia wymaga znajomości sparametryzowanej najpierw zapytania i wstrzyknięcie SQL.
Wydaje mi się, że oczywistym sposobem na rozwiązanie tego problemu byłoby wyłączenie oczywistej (ale niepoprawnej) opcji: napraw silnik bazy danych, aby każde otrzymane zapytanie, które używa zakodowanych wartości w klauzuli WHERE zamiast parametrów, zwróciło ładny, opisowy komunikat o błędzie instruujący zamiast tego użyć parametrów. Musiałoby to oczywiście wymagać opcji rezygnacji, aby takie rzeczy, jak zapytania ad-hoc z narzędzi administracyjnych nadal działały łatwo, ale powinny być domyślnie włączone.
Takie zamknięcie spowodowałoby zastrzyk SQL na zimno, prawie z dnia na dzień, ale o ile mi wiadomo, żaden RDBMS tak naprawdę nie robi. Czy jest jakiś dobry powód, dlaczego nie?
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC;
"bad"
jest naprawdę dosłowny, czy też wynika z połączenia łańcucha. Dwa rozwiązania, które widzę, to albo pozbywanie się SQL i innych DSL osadzonych na łańcuchach (tak, proszę), albo promowanie języków, w których łączenie łańcuchów jest bardziej irytujące niż używanie sparametryzowanych zapytań (umm, nie).
bad_ideas_sql = 'SELECT title FROM idea WHERE idea.status == "bad" AND idea.user == :mwheeler'
miałby zarówno zakodowane na stałe, jak i sparametryzowane wartości w jednym zapytaniu - spróbuj to złapać! Myślę, że istnieją uzasadnione przypadki użycia dla takich mieszanych zapytań.