Доброго времени суток. В разрабатываемом приложении работа с данными БД происходит через запросы, формируемые следующим образом (например данный запрос):
using (SQLiteDataReader rdr = Connection.ExecuteData($"SELECT Club,ChallengeName,Place,NumberOfMedals FROM List WHERE FIO = '{comboBox1.Text}'"))
очевидно, что используемый мной метод опасен на предмет внедрения всевозможного "нежелательного" кода.
Как можно от этого обезопаситься? Единственным ли решением является создание репозитория, и собственно хранение всех запросов в фиксированном виде(хранимые процедуры)?
Хранимые процедуры также защищают от SQL инъекций (если не исполнять внутри процедуры динамический SQL, используя execute, sp_executesql, и т.д.), как и параметризованные SQL запросы. Параметры процедур используются вместо литералов. SQL инъекция в этом случае не отработает и, скорее всего, вызовет ошибку или не вернет искомые данные.
Пример (SQL Server):
CREATE PROCEDURE dbo.getDetails @FIO nvarchar(100)
AS
SELECT Club,ChallengeName,Place,NumberOfMedals
FROM List
WHERE FIO = @FIO
GO
Даже если передать в в качества параметра строку:
"'Иванов'; DROP TABLE students;"
, то комманда DROP TABLE ... не выполнится.
PS ссылка на документацию об использовании параметров в хранимых процедурах в для C#
Надежными способами являются
Репозиторий и хранимые процедуры никак проблему инъекций не решают.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости