2009-08-18 5 views
1

좋아, 그럼 당신은 주입 공격뿐만 아니라 거대한 속도 향상을 피하기 위해 준비된 진술을 사용해야하지만, 나 자신이 SQL 쿼리를 작성하기 위해 문자열 조작을하는 것을 발견 한 장소가 여전히 있습니다. .복잡한 필터링을위한 SQL Prepared Stat

6 개 또는 7 개 또는 n 개의 드롭 다운 목록으로 구성된 검색 기능이 있다고 가정합니다. 각 목록에 기본값이 있는지 여부에 따라 항목을 내 where 절에 추가하려고합니다. 저장 프로 시저에 매개 변수를 전달하고 각 특정 where 절을 포함할지 여부를 결정할 수있는 준비된 문으로이 작업을 수행하는 좋은 방법이 있습니까?

+0

작성 하시려는 검색어의 예를 제공해 주시겠습니까? – Quassnoi

답변

2

이 질문에 대한 답변은이 기사에 대한 링크가 없으면 완전하지 않습니다. 그것은 Exec을하고 sp_executesql을 사용 넘어, 동적 SQL의 컨텍스트 내에서, 깊이 SQL 주입에 대해 설명합니다

저주와 동적 축복 SQL 가장 좋은 방법은 SQL을 매개 변수화되어
http://www.sommarskog.se/dynamic_sql.html

+0

링크가 깨졌습니다. – Aaron

+0

방금 ​​시도해 봤는데, 저에게 잘 맞습니다. .se 도메인을 사용할 수 없습니까? –

+0

+1 답변이 "의존적"이기 때문에 Erland는 그 방법을 보여줄 시간을 가졌습니다. – Anon246

0

서버는 where field like '%'과 같은 쿼리를 최적화해야하므로 모든 것을 포함하는 문을 준비하기 만하면됩니다. 이렇게하면 코드가 훨씬 간단해질 것입니다.

+0

참을 수없이 간단하게, 나는 내가 같은 것을 사용하는 것을 생각하지 않았다는 것을 믿을 수 없다. 그렇지 않으면 성능에 큰 영향을 미치지 않을까요? 나는 =보다 느린 좋은 비트처럼 인상을 받았다. – Aaron

+0

좋은 직감이지만 큰 문제는 아닙니다. 참조 : http://myitforum.com/cs2/blogs/jnelson/archive/2007/11/16/108354.aspx – Justin

0

sp_ExecuteSQL ... like :

CREATE PROCEDURE usp_SampleTest 
    @val1 INT 
    @val2 INT 
AS 
    DECLARE @sql NVARCHAR(500) 

    SET @sql = N'SELECT col1, col2, col3 FROM dbo.table WHERE 1 = 1' 

    IF @val1 IS NOT NULL 
     SET @sql = @sql + ' AND col3 = @pVal1' 

    IF @val2 IS NOT NULL 
     SET @sql = @sql + ' AND col4 = @pCol4' 

    EXEC sp_ExecuteSQL @sql, '@pVal1 INT, @pVal2 INT', @val1, @val2 

SQL Server는 SQL에서 최대의 유연성을 가진 실행 계획의 최소 개수를 실행 계획에 캐시합니다. 이런 식으로 sp_ExecuteSQL을 사용하면 SQL 주입 공격으로부터 안전하다는 것을 의미합니다.