2008-09-30 3 views
3

우리는 고전적인 ASP 검색 엔진을 SQL 주입으로부터 보호하기 위해 업데이트하려고합니다. 다양한 검색 매개 변수를 기반으로 쿼리를 연결하여 동적으로 쿼리를 작성하는 VB 6 기능이 있습니다. 키워드를 제외한 모든 매개 변수에 대해 동적 SQL을 사용하는 저장 프로 시저로 변환했습니다.동적 SQL - 검색 쿼리 - 변수 키워드 수

키워드의 문제점은 사용자가 제공 한 가변 숫자 단어가 있고 각 키워드에 대해 여러 열을 검색하려고한다는 것입니다. 각 키워드에 대해 별도의 매개 변수를 만들 수 없으므로 어떻게 안전한 쿼리를 작성할 수 있습니까?

예 :

@CustomerId AS INT 
@Keywords AS NVARCHAR(MAX) 

@sql = 'SELECT event_name FROM calendar WHERE customer_id = @CustomerId ' 

--(loop through each keyword passed in and concatenate) 

@sql = @sql + 'AND (event_name LIKE ''%' + @Keywords + '%'' OR event_details LIKE ''%' + @Keywords + '%'')' 

EXEC sp_executesql @sql N'@CustomerId INT, @CustomerId = @CustomerId 

SQL 주입에서이 및 유지 보호를 처리하는 가장 좋은 방법은 무엇입니까?

답변

3

듣고 싶지 않을 수도 있지만, 데이터베이스에서 실행하기 전에 코드에서 SQL 쿼리를 동적으로 구성하는 것이 좋습니다. SQL 문자열에서 매개 변수 자리 표시자를 사용하면 SQL 삽입 공격으로부터 보호받을 수 있습니다.

예 :

string sql = "SELECT Name, Title FROM Staff WHERE [email protected]"; 
using (SqlCommand cmd = new SqlCommand(sql)) 
{ 
    cmd.Parameters.Add("@UserId", SqlType.VarChar).Value = "smithj"; 

당신은 쿼리 다음 문자열이 완료되면 매개 변수 값을 추가해야 열 집합에 따라 SQL 문자열을 구축 할 수 있습니다. 이것은 약간의 고통이지만 가능한 입력에 대한 가능한 많은 순열을 제거하는 TSQL을 복잡하게 만드는 것보다 훨씬 쉽습니다.

+0

한이 방법은 탈출 문제를 완전히 방지 할 수 –

1

여기에는 3 가지 옵션이 있습니다.

  1. function that converts lists tables을 사용하십시오. 그래서 당신은 이와 같은 것을 갖게 될 것입니다.

    SELECT * 
    FROM calendar c 
        JOIN dbo.fnListToTable(@Keywords) k 
         ON c.keyword = k.keyword 
    
  2. 는 PARAMS의 고정 세트를 가지고, 오직 N 키워드의 최대 TSQL에서 탈출 문자열 함수를 작성하고 키워드를 탈출

    CREATE PROC spTest 
    @Keyword1 varchar(100), 
    @Keyword2 varchar(100), 
    .... 
    
  3. 에 검색 할 수 있습니다.

0
  • 당신이 그것을 필요로하지 않는 한, 당신은 단순히 [A-Za-z]와에없는 모든 문자를 제거 할 수 - 것들의 대부분은 검색에서되지 않습니다 그리고 당신은 할 수 없게한다 그런 식으로 주사하거나 키워드 나 그와 비슷한 것에 대해 걱정할 필요가 없습니다. 그러나 따옴표를 허용하면 더 조심해야합니다.

  • sambo99의 # 1과 마찬가지로, 당신은 임시 테이블이나 테이블 변수에 키워드를 삽입하고 주입의 위험없이 (심지어 와일드 카드를 사용)에 가입 할 수 있습니다 :

이 정말 동적이지 :

SELECT DISTINCT event_name 
FROM calendar 
INNER JOIN #keywords 
    ON event_name LIKE '%' + #keywords.keyword + '%' 
    OR event_description LIKE '%' + #keywords.keyword + '%' 
  • 당신은 실제로 ('에 기본값을 설정'또는 NULL이의 환경 설정에 따라 손으로 코딩하는 대신 매개 변수의 수가 많은 SP를 생성 할 수 있습니다 검색 코딩).더 많은 매개 변수가 필요한 것으로 밝혀지면 생성 된 매개 변수의 수를 늘리는 것이 간단합니다.

  • Lucene과 같은 데이터베이스 외부의 전체 텍스트 인덱스로 검색을 이동 한 다음 Lucene 결과를 사용하여 일치하는 데이터베이스 행을 가져올 수 있습니다.

0

이 작업을 시도 할 수 있습니다 :

SELECT * FROM [tablename] WHERE LIKE % +keyword%