Інжекція SQL - це дуже серйозна проблема безпеки, значною мірою тому, що це так просто помилитися: очевидний, інтуїтивний спосіб побудови запиту, що включає вхід користувача, залишає вас вразливими, а правильний спосіб його пом'якшення вимагає знати про параметризований спочатку запити та ін'єкція SQL
Мені здається, що очевидним способом виправити це було б вимкнення очевидного (але неправильного) варіанта: виправити двигун бази даних, щоб будь-який отриманий запит, який використовує жорстко закодовані значення в своєму пункті WHERE замість параметрів, повертав хороший, описовий повідомлення про помилку, яке вказує вам використовувати параметри. Очевидно, для цього потрібно мати варіант відмови, щоб такі речі, як спеціальні запити з адміністративних інструментів, все ще легко працюватимуть, але їх слід включити за замовчуванням.
Це дозволило б вимкнути інжекцію SQL холодно, майже протягом ночі, але, наскільки я знаю, жоден RDBMS насправді цього не робить. Чи є якась вагома причина, чому ні?
SELECT * FROM jokes WHERE date > DATE_SUB(NOW(), INTERVAL 1 DAY) ORDER BY score DESC;
"bad"
справді буквальний чи справді буквальний, чи є результатом конкатенації рядків. Я бачу два рішення: або позбавлення від SQL та інших вбудованих рядків DSL (так, будь ласка), або розкрутка мов, де об'єднання рядків більше дратує, ніж використання параметризованих запитів (umm, ні).
bad_ideas_sql = 'SELECT title FROM idea WHERE idea.status == "bad" AND idea.user == :mwheeler'
матиме як твердо кодовані, так і параметризовані значення в одному запиті - спробуйте це зрозуміти! Я думаю, що для таких змішаних запитів є дійсні випадки використання.