2009-11-24 3 views
1

다른 저장 프로 시저 내에서 저장 프로 시저에 텍스트를 추가하는 방법을 알고있는 사람이 있습니까? SQL Server 2005에서 다음과 같은 작업을 수행하려고합니다.매개 변수를 통해 SQL Server 2005에서 저장 프로 시저에 텍스트를 파싱하고 추가하는 방법

Declare str as Nvarchar(Max) = '' 
    set @spStr = dbo.spTest + 'Where testCol1 = ''Test''' 
    exec(@spStr) 

SQL 주입 공격에 대한 일부 논의가있을 수 있음을 이해했습니다. 위의 방식으로 where 절을 동적으로 전달하여 저장 프로 시저를 확장하기 위해 구문이 존재하지 않는지 확인하기 만하면됩니다.

답변

2

몇 가지 옵션이 있습니다.

당신은

당신은 SP를 매개 변수화 할 수 INFORMATION_SCHEMA.ROUTINES의 메타 데이터를 사용하여 실제 SP를 변경할 수 있습니다 (난 당신이 원하는 생각하지 정말 무슨 일을 할) -이 주입에 취약해서는 안됩니다 SP 경우 변수를 직접 사용하고 동적으로 SQL을 작성하지 않습니다.

대신보기 또는 인라인 또는 다단계 테이블 반환 함수를 사용하는 것이 좋습니다. 이는 매개 변수화 된보기 (인라인이 더 효율적 임)처럼 사용할 수 있습니다 - SELECT * FROM udf_Test WHERE TestCol1 = 'Test'.

SP의 결과를 가져 와서 임시 테이블이나 테이블 변수에 넣고 쿼리 할 수 ​​있습니다.

+0

나는 지난 제안을 좋아하지만 아래 답변과 같습니다. – Kyle

+0

IF OBJECT_ID ('tempdb .. # tmp')가 NULL이 아님 테이블 삭제 #tmp; CREATE TABLE의 #tmp (COL1 VARCHAR (10)) EXEC 판 sptest 가 NVARCHAR로 @spstr 선언 (COL1) INSERT #tmp의 (최대) 세트 @spStr = '#tmp에서 선택 * 여기서 COL1 ='1 ' ' exec (@spStr) – Kyle

3

Sql Server 모든 버전에서 사용할 수있는 구문이 없습니다.

  1. 당신은 분명히 프로 시저 코드 자체가 최종 규격 (들)의 필터로 처리 할 것 매개 변수를 포함하는 절차를 수정할 수에서 결과 집합을 반환 : 당신은 몇 가지 옵션을 가지고있다 프로 시저 호출. 비록 내가 그것에 대해 조언했지만, 당신은 확실히 당신이 추가하고자하는 실제 'where'절을 포함하는 varchar/nvarchar 데이터 유형이었던 매개 변수를 가질 수 있었고 프로 시저 코드가 최종 선택 문에 추가되었습니다. 마찬가지로

  2. insert/exec syntax을 사용하면 저장 프로 시저 실행 결과로 임시 테이블을 채우고 해당 임시 테이블에 대해 필터링 된 선택을 실행하기 만하면됩니다.

+0

두 번째 제안을 좋아합니다 ... 감사합니다! – Kyle

관련 문제