Я использую хранимые процедуры. Чтобы сэкономить время, я сделал несколько общих процедур, которые используют динамический заказ sqlin для обновления. Такая типовая процедура:Как предотвратить SQL Injection
CREATE PROCEDURE [dbo].[SetField]
@company_id uniqueidentifier,
@id bigint,
@field_code nvarchar(50),
@value nvarchar(50)
AS
BEGIN
DECLARE @field_name nvarchar(50)
SET @field_name = NULL
SELECT @field_name=field_name
FROM dbo.FIELD_DEFINITION
WHERE [email protected]_code
IF @field_name IS NOT NULL
BEGIN
IF @value IS NULL OR @value=''
BEGIN
SET @value='NULL'
END
ELSE
BEGIN
IF @field_code='START_DATE' OR @field_code='END_DATE'
BEGIN
SET @value = CONVERT(datetime, @value ,103)
END
SET @value=''''[email protected]+''''
END
DECLARE @sql nvarchar(1000)
SET @sql = 'UPDATE dbo.TABLE '+
'SET '[email protected]_name+'='[email protected]+' '+
'WHERE company_id=''' + CAST(@company_id as nvarchar(36)) + ''' AND '+
'id='+CAST(@id as nvarchar)
EXEC(@sql)
END
END
Как я могу предотвратить инъекцию sql с помощью этого кода?
Вы имеете в виду, кроме очевидного ответа, не используя динамический SQL в хранимой процедуре? – Thomas
@Thomas: Можете ли вы показать мне, как сделать следующее без динамического sql ?? – Naor
Попытка обобщить слишком много в программировании базы данных - это плохо. Напишите настоящие procs, которые делают то, что вам нужно сделать, не пытаясь сделать этот динамический материал, который вызовет больше проблем, чем он решает, поскольку он почти невозможно адекватно тестировать, а также рисковать инъекцией. – HLGEM