2014-09-16 1 views
0

가정하자 나는이 내 SQL 서버 (2008)에서 다음 두 테이블 DB :SQL Server는 집계 변수 열/출력 기능 만들기

표 :

Col1: ... Map: 
1  ... a 
2  ... a 
3  ... b 
4  ... c 
5  ... c 

매퍼 :

Map:  Out1: Out2: ... 
a  ab  ac 
b  ab  bd 
c  cd  ac 
d  cd  bd 
    ... (whatever) ... 

이제 테이블의 값을 나타내는 함수를 만들면 다음 그러나

SELECT 
    M.Out1, 
    SUM(T.Col1) 
FROM 
    Table1 as T, 
    Mapper as M 
WHERE 
    T.Map = M.Map 
GROUP BY 
    M.Out1 

나는 것/반환하는 Mapper의 어느 칼럼 그룹에 의해을 지시 할 수있는 매개 변수를 포함 할 수 있기를 (즉은, Out1 제한뿐만 아니라 돌아갈 수 불가 쿼리는 가능하면 Map 또는 Out2 등으로 그룹화됩니다. 사용자 입력의 일부 형식을 기반으로합니다 (나는 col로 입력한다고 가정합니다. 이름을 정의 입력으로 사용)).

동적 SQL을 사용하여이 작업을 수행 할 수 있지만 SQL 주입을 경고하는 게시물을 보았습니다. 더 좋은 방법이 있습니까 ??

감사합니다.

1) 동적으로 생성되는 임시 테이블에 sp_executesql를 사용하고 결과를 저장 :

+1

dyanmic sql에 QUOTENAME을 사용하는 경우 괜찮습니다. 열 이름 (변수)을 QUOTENAME으로 묶으십시오. –

+0

굉장, @SeanLange, 들어 본 적이 없어! - 지금 그걸 들여다보기! - 감사!! –

답변

2

다음은 예제입니다. 느슨하게 당신의 예를 기반으로합니다. 공지 이전 ANSI-89 스타일 조인 대신 조인을 ANSI-92 스타일 조인으로 변경했습니다. 읽기 쉽고 우발적 인 교차 결합이 적습니다.

declare @ColumnNameParameter sysname = 'MyColumn;] that is injection safe' 

declare @SQL nvarchar(max) 

set @SQL = 
'select M.' + QUOTENAME(@ColumnNameParameter) 
+ ', SUM(T.Col1) 
from Table1 as T 
join Mapper as M on M.Map = t.Map 
GROUP BY M.' + QUOTENAME(@ColumnNameParameter) 

select @SQL 
0

당신은 내가 말할 수있는 두 가지 옵션이 있습니다. 이 경우에는 'SELECT [custom column mapping columns] INTO #TEMPTable FROM [Mapped/Joined Table[s]] '

을 실행할 수 있어야합니다. 2) SQL 내에서 CLR을 사용하십시오.

죄송합니다. SQL 주입에 대한 우려에 응답하지 않았습니다. 항상 알고 있어야 할 것이므로 걱정할 필요가 없다면 사용자 입력을 구문에 추가하기 전에 구문 분석 할 수 있습니다. 예를 들어 단어가 하나만 존재하고 특정 길이를 넘어서지 않으며 SELECT, UPDATE, DELETE, DROP 등과 같은 SQL 키워드가 포함되지 않도록 할 수 있습니다.

+0

이러한 유형의 유효성 검사는 SQL 주입을 방지하기에 충분하지 않습니다. 주입 공격은 일반 텍스트 일 ​​필요는 없습니다. –

+0

일반 텍스트가 아닌 경우 버퍼 오버플로를 일으켜 실행 코드를 주입하는 공격이라고 가정합니다. 이 경우 반환 된 사용자 입력의 길이를 확인하는 것으로 충분합니까? – RyanH

+0

직접 실행하는 것은 아닙니다. 나는 약 10 분 만에 회의를 가졌지 만, 내가 돌아 왔을 때 이것을 보여줄 것입니다. –