Вярвам, че има три различни случая, за които трябва да се тревожите:
- низове (всичко, което изисква кавички):
'''' + replace(@string, '''', '''''') + ''''
- имена (всичко, където кавичките не са разрешени):
quotename(@string)
- неща, които не могат да бъдат цитирани:това изисква бели списък
Забележка :Всичко в низова променлива (char
, varchar
, nchar
, nvarchar
и др.), който идва от контролирани от потребителя източници, трябва да използва един от горните методи. Това означава, че дори неща, които очаквате да бъдат числа, се цитират, ако се съхраняват в низови променливи.
За повече подробности вижте Списание на Microsoft (Остарала връзка:2016-10-19) .
Ето пример, използващ и трите метода:
EXEC 'SELECT * FROM Employee WHERE Salary > ''' +
REPLACE(@salary, '''', '''''') + -- replacing quotes even for numeric data
''' ORDER BY ' + QUOTENAME(@sort_col) + ' ' + -- quoting a name
CASE @sort_dir WHEN 'DESC' THEN 'DESC' END -- whitelisting
Също така имайте предвид, че като правите всички операции с низове на линия в EXEC
твърдение, че няма загриженост за проблемите с отрязването. Ако присвоите междинните резултати на променливи, вие трябва уверете се, че променливите са достатъчно големи, за да задържат резултатите. Ако направите SET @result = QUOTENAME(@name)
трябва да дефинирате @result
да съдържа поне 258 (2 * 128 + 2) знака. Ако направите SET @result = REPLACE(@str, '''', '''''')
трябва да дефинирате @result
да бъде два пъти по-голям от @str
(приемете всеки знак в @str
може да бъде цитат). И разбира се, низовата променлива, съдържаща крайния SQL израз, трябва да е достатъчно голяма, за да побере целия статичен SQL плюс всички резултатни променливи.