2009-03-24 2 views
1

누가 SQL 문이 '%'+ @ Keywords + '%' '와 (과) 같이'+ @SearchCat + '와' '을 좋아하지 않는지 이해할 수 있습니까? 작은 따옴표의 수와 관련이 있지만 알아낼 수는 없습니다. 따옴표는 어떻게 작동합니까? 그 논리는 뭐니?SQL 변수

DECLARE @strStatement varchar(550) 
declare @state as varchar(50) 
declare @district as varchar(50) 
declare @courttype as varchar(50) 
declare @SearchCat as varchar(50) 
declare @KeyWords as varchar (50) 

select @State ='FL' 
select @district = '11' 
select @courtType = '1' 
select @SearchCat='CaseNumber' 
select @KeyWords='File' 


select @strStatement= 'SELECT CaseNumber FROM app_Case 
      where State ='''+ @State+ 
      ''' and District='''+ @District+ 
      ' and ' + @SearchCat + 'like '%'[email protected]+'%'' 


exec (@strStatement) 

답변

0

알아낼 수 있습니다. 나는 당신은 또한 당신의 '%'문자, 주위에 작은 따옴표의 번호를 잘못있어

2

내가

'처럼'앞에 공백 누락 된 '처럼'앞에 공백 누락 된 그것을 혼란스럽게 할 것입니다.

덧붙여서, SQL 내부에서 SQL injection 보안 구멍이 생겼습니다. 매개 변수 중 하나에 아포스트로피가 있으면 sqlStatement가 중단되고 매개 변수 이름에있는 불량 SQL이 실행됩니다.

이 공격을 방지하기 위해 작은 따옴표를 두 배로 기능을 REPLACE를 사용할 수 있습니다

' AND '+QUOTENAME(@SearchCat)+' LIKE ''%'+REPLACE(@Keywords, '''', '''''')+'%''...' 

(열 이름은 대역 외 문자가 포함 또는 예약어 인 경우 QUOTENAME가 필요합니다.)

모든 문자열 리터럴을 지루하게 바꾸는 것보다 SQL을 생성하는 데 더 깔끔한 (그러나 아주 장황한) 방법은 sp_executesql을 사용하는 것입니다. 예를 들면 :

SELECT @strStatement= N' 
    SELECT @Number= CaseNumber FROM app_Case 
    WHERE [email protected] AND [email protected] 
    AND '+QUOTENAME(@SearchCat)+N' LIKE ''%''[email protected]+''%'' 
'; 
SELECT @params= N'@State varchar(50), @District varchar(50), @Keywords varchar(50), @Number int OUTPUT'; 

EXECUTE sp_executesql @strStatement, @params, @State, @District, @Keywords, @Number OUTPUT; 

덧붙여 @searchCat는 서로 다른 값의 수가 적은 수 있다면, 당신은이 모든 힘든 동적 SQL 무의미한 중 하나를 수행하는 것을 방지하기 위해 해결 방법을 사용할 수 있습니다

SELECT CaseNumber FROM app_Case 
WHERE [email protected] AND [email protected] 
AND CASE @searchCat 
    WHEN 'searchableColumnA' THEN searchableColumnA 
    WHEN 'searchableColumnB' THEN searchableColumnB 
END LIKE '%'[email protected]+'%'; 

this을 참조하십시오. T-SQL에서 동적으로 생성 된 SQL 문을보다 자세히 살펴보고 더 많은 배경과 직면 한 위험을 파악하십시오.