SQL Injection, dynamiczne kolumny

Możemy sobie wyobrazić sytuację gdzie do procedury jest dostarczana dynamiczna liczba lista kolumn:

sqlinjeciton

Lista kolumn może mieć różną formę np: *, [kolumna], kolumna, kolumna as kol itd. Bardzo łatwo coś do takiej listy wstrzepić. Więc poproszono mnie o załatanie takich smaczków. Napisałem poniższą funkcję, której celem jest zwrócenie „bezpiecznej listy kolumn”:

CREATE FUNCTION [dbo].[SafeColumnNames]
(
	@fields varchar(8000)
)
RETURNS varchar(8000)
AS
BEGIN
	declare @result varchar(8000);
		
	SELECT
		@result = CASE
			WHEN @result IS NULL THEN T.value 
			ELSE @result + ',' + T.value 
		END
	FROM 
		(
			SELECT 
				CASE					
					WHEN V.value = '*' THEN V.value
					WHEN V.value like '% as %' 
						or V.value like '%]as[%' 
						or V.value like '%]as [%'
						or V.value like '%] as[%'
						or V.value like '%] as [%' THEN 
							(SELECT								
								CASE 
									WHEN 
										ASCII(SUBSTRING(t.value,1,CHARINDEX(' as ', t.value))) = 39
										or
										dbo.udfTrim(SUBSTRING(t.value,1,CHARINDEX(' as ', t.value))) like '' THEN								
										dbo.udfTrim(SUBSTRING(t.value,1,CHARINDEX(' as ', t.value))) + ' as '
									ELSE										
										'[' 
											+ dbo.udfTrim(SUBSTRING(t.value,1,CHARINDEX(' as ', t.value))) +
										'] as ' 
									END
										+ 
										'[' 
											+ dbo.udfTrim(SUBSTRING(t.value,CHARINDEX(' as ', t.value)+4,len(t.value))) +
										']'
							 FROM 
								(SELECT dbo.udfTrim(replace(replace(V.Value,'[',' '),']',' ')) AS value) 
							AS t)
					WHEN LEFT(dbo.udfTrim(V.value),1) = '[' and RIGHT(dbo.udfTrim(V.value),1) = ']' THEN dbo.udfTrim(V.value)
					WHEN V.value = '''' THEN ''
					ELSE quotename(dbo.udfTrim(V.value)) 
				END as value
			FROM 
				dbo.SplitString(@fields,',') AS V
		) as T;		     

	RETURN @result

END

Do działania funkcji potrzebna jest funkcja SplitString http://stackoverflow.com/a/19935594 oraz funkcja udfTrim http://www.codeproject.com/Tips/330787/LTRIM-RTRIM-doesn-t-always-work

Przykłady jej działania:
sqlinjeciton3

Poprawiona wersja pierwszego przykładu:
sqlinjeciton2

Share Button

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Time limit is exhausted. Please reload the CAPTCHA.