Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да почистя (предотвратя SQL инжектирането) динамичен SQL в SQL Server?

Вярвам, че има три различни случая, за които трябва да се тревожите:

  • низове (всичко, което изисква кавички):'''' + 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 плюс всички резултатни променливи.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разберете дали даден дял е компресиран в SQL Server (T-SQL)

  2. Създаване на DISTINCT стойности в STRING_AGG

  3. Моментни снимки на базата данни на SQL Server -3

  4. Свържете се с базата данни MSSQL с помощта на Flask-SQLAlchemy

  5. Защо sql сървърът съхранява знаци за въпросителен знак вместо японски знаци в полетата на NVarchar?