Ваше приложение не должно отправлять код непосредственно на сервер базы данных, а отправляет его через промежуточный уровень. Он может легко анализировать все, что должно быть отправлено в БД, и накладывать на него некоторые ограничения.
Например, заставить весь код SQL состоять из one и не более одного оператора, и либо отклонить его, либо выполнить первый оператор, только если их больше одного.
Основные атаки SQL-инъекций включают в себя такой код:
DECLARE @SQL VARCHAR(4000), @Table VARCHAR(50)
SET @Table='Employees' -- Imagine this actually comes as a parameter from app
SET @SQL='SELECT * FROM '+@Table
EXEC(@SQL)
Злоумышленник может передать строку "systables"; UPDATE BankAccount SET Money = Money + 10000 WHERE AccountCode = 12345; DROP TABLE AuditTrails; " в БД - это имело бы катастрофические последствия.
Имея средний уровень, выполняющий этот минимальный анализ строк, вы защищены от этой самой простой атаки SQL-инъекций. Для других вы можете добавить их на средний уровень (и он также может обрабатывать кэширование результатов, регулирование полосы пропускания и т. Д.)
Если вам понадобится для передачи более чем одного оператора SQL из вашего приложения, я бы сказал, что вы делаете что-то неправильно, и должен инкапсулировать эту логику в хранимой процедуре или минимум на самом среднем уровне. 1014 *