Все, что я видел в атаках с использованием SQL-инъекций, показывает, что параметризованные запросы, особенно хранимые процедуры, являются единственным способом защиты от таких атак. Пока я работал (еще в темные века), хранимые процедуры считались плохой практикой, главным образом потому, что их считали менее обслуживаемыми; менее проверяемый; сильно связанный; и заблокировал систему в одном поставщике; ( этот вопрос охватывает некоторые другие причины).
Хотя, когда я работал, проекты практически не знали о возможности таких атак; Были приняты различные правила для защиты базы данных от разного рода коррупции. Эти правила могут быть обобщены как:
- Ни один клиент / приложение не имеет прямого доступа к таблицам базы данных.
- Все обращения ко всем таблицам осуществлялись через представления (а все обновления базовых таблиц выполнялись с помощью триггеров).
- У всех элементов данных был указан домен.
- Ни один элемент данных не мог быть обнуляемым - это имело значение, что администраторы базы данных иногда стискивали зубы; но был исполнен.
- Роли и разрешения были установлены соответствующим образом - например, ограниченная роль, которая дает только представлениям право изменять данные.
Так является ли набор (принудительных) правил, таких как этот (хотя и не обязательно этот конкретный набор), подходящей альтернативой параметризованным запросам для предотвращения атак внедрения SQL-кода? Если нет, то почему нет? Можно ли защитить базу данных от таких атак с помощью конкретных (только) мер?
РЕДАКТИРОВАТЬ
Акцент на вопрос изменился незначительно, в свете первых полученных ответов. Базовый вопрос без изменений.
EDIT2
Подход, основанный на параметризованных запросах, кажется лишь второстепенным шагом в защите от атак на системы. Мне кажется, что более фундаментальные средства защиты и желательны, и могут сделать опору на такие запросы ненужными или менее критичными даже для защиты от атак с использованием инъекций.
Подход, подразумеваемый в моем вопросе, был основан на «защите» базы данных, и я понятия не имел, является ли это жизнеспособным вариантом. Дальнейшие исследования показали, что существуют такие подходы. Я нашел следующие источники, которые обеспечивают некоторые указатели на этот тип подхода:
http://database-programmer.blogspot.com
http://thehelsinkideclaration.blogspot.com
Принципиальные особенности, которые я взял из этих источников:
- Обширный словарь данных в сочетании с обширным словарем данных безопасности
- Генерация триггеров, запросов и ограничений из словаря данных
- Минимизируйте код и максимизируйте данные
Хотя ответы, которые я получил до сих пор, очень полезны и указывают на трудности, возникающие из-за игнорирования параматеризованных запросов, в конечном итоге они не отвечают на мои первоначальные вопросы (теперь выделены жирным шрифтом).