Ik geloof dat er drie verschillende gevallen zijn waar u zich zorgen over moet maken:
- strings (alles dat aanhalingstekens vereist):
'''' + replace(@string, '''', '''''') + ''''
- namen (alles waar aanhalingstekens niet zijn toegestaan):
quotename(@string)
- dingen die niet kunnen worden geciteerd:dit vereist een witte lijst
Opmerking :Alles in een stringvariabele (char
, varchar
, nchar
, nvarchar
, enz.) die afkomstig is van door de gebruiker gecontroleerde bronnen, moet een van de bovenstaande methoden gebruiken. Dat betekent dat zelfs dingen waarvan je verwacht dat het getallen zijn, worden geciteerd als ze worden opgeslagen in stringvariabelen.
Voor meer details, zie het Microsoft Magazine (Verouderde link:2016-10-19) .
Hier is een voorbeeld waarin alle drie de methoden worden gebruikt:
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
Merk ook op dat door alle tekenreeksbewerkingen inline uit te voeren in de EXEC
verklaring is er geen probleem met truncatieproblemen. Als u de tussenresultaten aan variabelen toewijst, moet u moeten zorg ervoor dat de variabelen groot genoeg zijn om de resultaten vast te houden. Als je SET @result = QUOTENAME(@name)
. doet je moet @result
definiëren minimaal 258 (2 * 128 + 2) tekens bevatten. Als u SET @result = REPLACE(@str, '''', '''''')
doet je moet @result
definiëren twee keer zo groot zijn als @str
(neem aan dat elk teken in @str
zou een citaat kunnen zijn). En natuurlijk moet de stringvariabele die de uiteindelijke SQL-instructie bevat, groot genoeg zijn om alle statische SQL plus alle resultaatvariabelen te bevatten.