Внедрение SQL - это очень серьезная проблема безопасности, во многом потому, что ее легко понять неправильно: очевидный, интуитивно понятный способ создания запроса, включающего пользовательский ввод, делает вас уязвимым, а правильный путь для его смягчения требует, чтобы вы знали о параметризации запросы и SQL-инъекция в первую очередь.
Мне кажется, что очевидный способ исправить это - отключить очевидную (но неправильную) опцию: исправить механизм базы данных так, чтобы любой полученный запрос, использующий жестко закодированные значения в своем предложении WHERE вместо параметров, возвращал хороший, описательный сообщение об ошибке, указывающее вам использовать параметры вместо. Очевидно, что для этого потребуется опция отказа, чтобы такие вещи, как специальные запросы от административных инструментов, по-прежнему выполнялись легко, но по умолчанию они должны быть включены.
При таком отключении SQL-инъекция холодная, почти на ночь, но, насколько я знаю, ни одна СУБД на самом деле не делает этого. Есть ли веская причина, почему нет?
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC;
"bad"
является ли литерал действительно литералом или результатом конкатенации строк. Два решения, которые я вижу, это либо избавление от SQL и других встроенных в строки DSL (да, пожалуйста), либо продвижение языков, в которых конкатенация строк более раздражает, чем использование параметризованных запросов (мм, нет).
bad_ideas_sql = 'SELECT title FROM idea WHERE idea.status == "bad" AND idea.user == :mwheeler'
будет иметь жестко запрограммированные и параметризованные значения в одном запросе - попробуйте поймать это! Я думаю, что есть допустимые варианты использования для таких смешанных запросов.