2011-01-26 3 views
7

이 상황에 대해 의심의 여지가 있습니다.Like 절 및 SQL 인젝션

I했습니다 저장 프로 시저 내에서이 같은 쿼리 :

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

내 질문은,이 SQL 인젝션에 취약하다? 나는 이런 식으로 뭔가로 변경해야합니까 : (?)

declare @column1Like nvarchar(200); 

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

SELECT column1, column2 
FROM table1 
WHERE column1 like @column1Like 

감사

답변

6

빠른 대답은 아니오입니다. SQL 인젝션에 취약하려면 동적 SQL 실행을 사용해야합니다.

은 취약 할 것 :

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

도 (적어도 보안 관점에서) 당신의 두 예제 사이의 진정한 차이가없는 것을 의미한다.

1

그것을 이미 SQL 공간에서 문자열 값이기 때문에 그것은 취약하지 않습니다. 그러나 쿼리가 손상 될 수 있습니다. 이 쿼리는 변수와 함께 작동하기 때문에

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

는, 대신 데이터의 코드를 삽입하는 곳이 없으며, 따라서 SQL 주입에 취약하지 않습니다.

여기서 은 SQL Server이고 클라이언트 측 언어의 매개 변수화 된 쿼리 기능을 사용하여 값을 바인딩한다고 가정합니다.

+1

예,이 보안 문제에 대해 매우 조심 해요처럼 또 다른 예를 생각해야합니다. 그러나 나는 이것을 잡지 못했습니다 : P –

1

매개 변수가있는 쿼리를 사용 중이기 때문에이 쿼리는 SQL 주입에 취약하지 않습니다.

2

좋아요는 = 또는 다른 조건과 다릅니다.

그러나 사용자는 추가 와일드 카드 문자 (%, _)를 패턴에 삽입 할 수 있습니다. 그게 중요하다면.

-1

나는 예를 들어, 취약 생각 : '%'또는 @column1Like 같은 형식에게 그것을하지는 경우 1 = 1-- 데이터베이스의 모든 레지스터가 표시됩니다. 이 경우

, 나는 ( @column1Like= '' 또는 @column1Like is null) 같 키우면 생각하지만 당신은

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