2010-04-09 6 views
0

이것은 소리가 날 것입니다. 그러나 누구도 특별한/우스꽝스런 노력 없이도 SQL Server 2005에서 부울 논리 문자열을 구문 분석 할 수있는 기술을 보유하고 있습니까? 여기 부울 논리 문자열을 구문 분석하려면 어떻게해야합니까?

은 예입니다

(SOMEVAR=4 OR SOMEVAR=5) AND (NOT OTHERVAR=Y) 

나는 그 SQL에서 할 수 있다면 많은 도움이 될 재귀 같은 느낌하지만 난 그런 종류의 물건에 대해 이동하는 방법을 정말 모르겠어요. 그렇지 않다면 아마도 나를위한 재귀를 수행하기 위해 외부 시스템을 연결하는 방법이있을 것입니다. 걱정하지 마라. 나는 희망을 얻지 못한다.

+0

약간의 배경이 도움이 될 수 있습니다. – ChaosPandion

+0

파싱에서 무엇을 얻으시겠습니까? 표현 트리? –

+0

가장 외부의 문장이 true 또는 false로 끝나는 지 궁극적으로 알아야합니다. 구문 분석하는 동안 나는 아마도 변수에 대한 검사를 수행하고있을 것이라고 생각합니다. –

답변

1

가장 좋은 방법은 CLR integration입니다. 이렇게하면이 문제를 해결할 코드를 쉽게 찾고 개발할 수 있습니다.

0

일부 프로세스 (웹 사이트 또는 기타)에서 입력으로 논리 문자열을 수신하는 경우이를 사용하여 동적 SQL 문자열을 작성하고 실행할 수 있습니다. 이 방법으로 주입 공격에 매우주의해야합니다.

0

'가장 외부 문장이 진실인지 또는 거짓인지 궁극적으로 알아 내야한다는 것을 알 필요가있다'는 의견에서 판단한 다음 표현식을 분석 할 필요가 없다면 평가할 필요가 있습니다. 당신은 sp_executesql을 함께 시도 할 수 있습니다 :

  • 그것의 @expression는 반드시 SQL 주입에 열려 :

    ... 
    declare @sql nvarchar(max); 
    declare @result bit; 
    -- consider @expression has the expression to be evaluated 
    -- eg. @expression = '(@SOMEVAR=4 OR @SOMEVAR=5) AND (NOT @OTHERVAR=''Y'')'; 
    set @sql = N'set @result=case when ' + @expression + N' then 1 else 0 end;'; 
    exec sp_executesql @sql, N'@SOMEVAR int, @OTHERVAR vachar(max), @result bit output', @SOMEVAR, @OTHERVAR, @result output; 
    SELECT @result; 
    ... 
    

    을이 당신이 (표현식을 평가) 관심이 무엇 않지만, 그것은 중요한 문제가있다 입력을 신뢰할 수

  • @expression 만 sp_executesql을하는 동안 당신이 에에서 sp_executesql 모든 지역 변수를 전달, 또는 앱 수있는 적어도 모든 지역 변수 필요
  • 을 당신이 통과 지역 변수를 참조 할 수 있습니다 @expression
  • 귀는 새로운 지역 변수는 sp_executesql을 @expression에 오류가로까지 전파됩니다
  • (모두 매개 변수 로 선언하고 실제로 매개 변수로 추가)에 전달되어야로 유지하기 어렵다 실행 오류 (이 문제를 방지하기 위해 BEGIN TRY/BEGIN CATCH로 감쌀 수 있습니다)

나는 구체적인 컨텍스트를 알지 못하지만 평가가 필요한지 고려해보십시오. 필자는 비슷한 문제 (평가할 구성 테이블에서 오는 표현)를 처리해야했기 때문에 완전히 그렇지 않다고 말하지 않습니다.

관련 문제