Ради аргумента давайте просто скажем, что я должен создать локальную переменную, содержащую запрос SQL, который имеет INSERT:
DECLARE @insert NVARCHAR(MAX)
SELECT @insert = 'INSERT INTO [dbo].[' + @table + '] VALUES...
EXEC (@insert)
Этот INSERT также будет содержать значение столбца:
DECLARE @insert NVARCHAR(MAX)
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
Теперь я явно обеспокоен атакой с помощью инъекций и хотел бы убедиться, что значение @ message не может сделать значение @ insert злонамеренным или искаженным как запрос к EXEC.
Это подводит нас к моему вопросу: достаточно ли экранирования 'символов в @message? Есть ли другие символы, которые могли бы появиться в @message, которые могли бы исчезнуть?
Пример:
DECLARE @insert NVARCHAR(MAX)
SELECT @message = REPLACE(@message,'''','''''')
SELECT @insert =
'INSERT INTO [dbo].[' + @table + '] VALUES (N''' + @message + ''')'
EXEC (@insert)
(Когда я говорю " должен ", это потому, что мой запрос находится в хранимой процедуре, и эта хранимая процедура принимает @table, которая является таблицей назначения, в которую нужно вставить INSERT. Я не интересно обсудить мою архитектуру или почему таблица для INSERT "динамически" указывается с помощью параметра процедуры. Пожалуйста, воздержитесь от комментирования этого , если кроме EXEC () нет другого способа запроса таблицы для указания INSERT, когда затем имя таблицы принимается в качестве параметра процедуры .)