2011-01-26 11 views
7

Mam wątpliwości co do tej sytuacji.Podobnie jak klauzula i wtrysk sql

mam zapytanie jak to w procedura składowana:

SELECT column1, column2 
FROM table1 
WHERE column1 like '%' + @column1 + '%' 

Moje pytanie jest, jest podatna na SQL Injection? Czy muszę zmienić na coś takiego: (?)

declare @column1Like nvarchar(200); 

@column1Like = '%' + @column1 + '%' 

SELECT column1, column2 
FROM table1 
WHERE column1 like @column1Like 

Pozdrowienia

Odpowiedz

6

Szybka odpowiedź brzmi: nie. Aby być podatnym na iniekcję SQL, trzeba użyć dynamicznego wykonywania SQL.

To byłby podatny:

EXECUTE ('SELECT column1, column2 FROM table1 WHERE column1 like ' + @column1Like); 

Oznacza to również nie ma istotnej różnicy między obu twoich przykładów (z punktu widzenia bezpieczeństwa co najmniej).

1

To nie jest zagrożony, ponieważ już to ciąg znaków w przestrzeni SQL. Mimo to może przerwać zapytanie.

2
SELECT column1, column2 
FROM table1 
WHERE column1 like '%' + @column1 + '%' 

Ponieważ ta kwerenda działa tylko ze zmiennymi, to nie ma miejsca, aby umieścić kod zamiast danych, a tym samym nie jest podatny na SQL iniekcji.

Oczywiście zakładam, że @column1 jest tutaj zmienną SQL Server i używasz sparametryzowanej funkcji zapytania w języku po stronie klienta, aby powiązać z nią wartość.

+1

Tak, jestem bardzo ostrożny o kwestiach bezpieczeństwa. Ale tego nie złapałem: P –

1

Twoje zapytanie nie jest podatne na iniekcję SQL w obu przypadkach, ponieważ używasz sparametryzowanego zapytania.

2

Podobnie jak nie różni się od = lub innego predykatu.

Użytkownik może jednak wprowadzić dodatkowe znaki wieloznaczne (%, _) we wzorze; jeśli to ma znaczenie.

-1

myślę, że jest podatny na przykład: „%” lub 1 = 1-- pokaże wszystkie rejestry bazy przypadku sformatowania Do not go jak @column1Like.

W tym przypadku, myślę its samo niż (@column1Like= '' lub @column1Like is null) ale trzeba myśleć kolejne przykłady jak

'%' union select SELECT `column11`, `column22` 
FROM table2 where `colum11` -- is the same type than `column1` 
--and `column22` is the same type than `column22`.