sql >> Database >  >> RDS >> Sqlserver

Hoe dynamische SQL opschonen (voorkomen van SQL-injectie) in SQL Server?

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.



  1. Wat is de beste PostgreSQL GUI? 2021 Vergelijking

  2. Oct2014CPU crasht ArcGIS Desktop

  3. SQL-prestaties op LEFT OUTER JOIN vs NOT EXISTS

  4. FOUT:toestemming geweigerd voor reeks cities_id_seq met Postgres