2013-08-21 2 views
3

SQL 로직에 대한 도움이 필요하며,이 작업을 2 일 동안 성공적으로 마쳤습니다.Where 절에있는 열 이름으로 SQL 변수

내 목표는 ASP 페이지의 변수를 where 절의 열 이름에 대한 조건으로 변수를 사용하는 저장 프로 시저로 전달하는 것입니다. 그래서 예를 들면

(내 쿼리의 단순화 된 버전) :

@strDept nvarchar(10), @strUser nvarchar(30) 
-- The asp page will pass f18 to @strDept & Ted Lee to strUser 
-- f18 is the column name in my database that I need in the where. 

select x, y, z from table1 where @strDept in (@strUser) 
-- and this is the select statement, notice the where clause. 

저장된 프로 시저를 실행 않지만, 열이 어떤 값을 반환하고 나는 그것 리터럴 NVARCHAR로 @strDept 치료를 알고 있지 이름.

제 질문은 SQL Server 2005에서 @sqlDept 변수를 열 이름으로 처리하도록하려면 어떻게해야합니까?

+0

그래서'@ strUser'는 쉼표로 구분 된 정수 목록입니다. –

+0

아니요, @struser는 문자열이 포함 된 텍스트 상자를 참조하며, 저장된 텍스트 상자로 전달됩니다. – SyD

답변

5

이것은 내부 회사 응용 프로그램 인 경우 모든 사람들이 왜 반복적으로 SQL 삽입을 죽이면 ...동적 SQL을 사용하는 것이 매우 간단합니다. 당신이 편안하다면 이것들은 내부 사용자 만이 매우 간단합니다. 여기에 개념이 있습니다. 당신은 본질적으로 SQL 문인 문자열을 작성한 후 실행하는 SQL 문을 작성합니다.

1. SQL 문을 저장할 변수를 선언하십시오.

DECLARE @SQL varchar(max) 

2. 당신의 @SQL 변수는 SELECT 문이어야합니다. 기본적으로 당신은 그것을 만들고 있기 때문에 당신이 쓰고 싶은 것을 돌려줍니다. 이처럼 :

SET @SQL = 'select x, y, z from table1 where' + @strDept + 
' in ' + @strUser 

3. @SQL 정책을 실행하고 당신이 실행 똑같이 될 것입니다 : SELECT X, Y, 표 1에서 Z 어디 F18 = '테드 리'

EXEC (@SQL) 
END 
+1

사용자가 링크를 클릭하기 만하면 페이지에 필요한 내용이 표시됩니다. 주입 부분은 코드에 의해 수행되며 그 이유는 제가 동적 절차를 고려하고 있기 때문입니다 Btw - 고마워,이게 정확히 뭐야? 나는 쓰려고 애썼다. – SyD

+0

@SyD - 문제 없습니다 ... 일부 답변이 다소 혼란 스러웠습니다. 당연히 공개 된 웹 사이트에서 모든 주입 안전 기능으로 100 % 동의하는 것이 필요했습니다. 행운을 빈다. – logixologist

1

일부 동적 SQL을 사용할 수 있습니다. 예 :

선택 X, Y, Z를 테이블에서 어디에서 DEPT1 (: 귀하의 경우

DECLARE @sqlDept VARCHAR(100)='CURRENT_TIMESTAMP'; 

EXEC('SELECT '[email protected]) 

SELECT @DynamicSql; 

당신에게 줄 것이다 그리고

DECLARE @strDept nvarchar(10)='dept1' 
,@strUser nvarchar(30)='user1'; 

DECLARE @DynamicSql nvarchar(1000); 

SET @DynamicSql='select x, y, z from table where '[email protected]+' in ('''[email protected]+''')'; 

될 것입니다 'user1')

당신이

EXEC(@DynamicSql); 
+0

나는 위의 코드가 무엇을하는지 이해할 수 없다. 설명해 주시겠습니까? – SyD

+0

나는 주사에 관한 다른 의견에 동의하지만, 조금 더 명확하게 대답을 업데이트했습니다. – HotblackDesiato

3

왜 열 이름을 동적으로 만들 싶지 않기 때문에 이렇게이 문을 실행하려면? 달성하려는 계획은 무엇입니까? 위와 같은 동적 쿼리를 사용할 수 있지만 주입 공격이 시작될 수 있습니다.

그걸로 무엇을하고 싶은지 설명하면 다른 해결책을 추천 할 수 있습니다.

+0

기본적으로 우리 회사는 대시 보드 보고서가 필요합니다. 대시 보드에는 관리자보기 및 개별보기가 있습니다. 본질적으로는 파이프 라인이지만 문제는 데이터베이스에 부서별 필드가 다르며이 필드는 개별 직원의 이름을 갖고 있다는 것입니다. 가장 쉬운 해결책은 프로 시저에 숫자를 전달하고 올바른 필드가 포함 된 IF 문을 복사하여 붙여 넣는 것입니다.하지만 그것은 시간이 오래 걸리고 복잡합니다. 부서별 ASP 페이지를 기반으로 열 참조를 동적으로 입력하려고했습니다. – SyD

7

당신이 이것을하는 방법에 대한 지침을 찾을 수없는 이유는 그것이 이라는 매우 나쁜 아이디어 인 것입니다..

조만간 누군가가 1 ;drop database badidea의 "열 이름"을 전달하게됩니다. 모든 사람들에게 축복이 될 것입니다.

SQL 인젝션을 읽고 디자인을 다시 생각해보십시오.

+0

그래, 동적 SQL에 관한 모든 애비뉴는 단방향 SQL 인젝션 거리를 이끌었다. 하지만 여기에 사용자가 명시 적으로 저장 프로 시저에 아무 것도 전달할 수 없습니다. 페이지가 혼자서 변수를 전달하는 경우에도 여전히 주입 공격을받을 수 있습니까? – SyD

+0

매개 변수가 엄격하게 제어되는 경우 아니요. 하지만 어떻게 될까요? 그것을 배포하십시오. 그러면 조만간 누군가가 "우리가 좋아하는 분야를 선택할 수 있을까?"라고 말하면서 누군가는 "아, 그건 간단한 변화처럼 보입니다. 나는이 비트를 꼬집어 볼 것입니다 ... – podiluska

+0

@SyD 게다가, 당신은'아니오, @ 스트 러커가 문자열이있는 텍스트 상자를 참조하고 있습니다. '라고 말했습니다. – podiluska

0

동적 SQL을 작성하고 열이 있는지 확인하고 열 이름에 SQL 주입을 방지하는 방법을 찾는 것이 가장 좋은 방법이라고 생각합니다.

declare @strDept nvarchar(10), @strUser nvarchar(30), 
     @sql nvarchar(300), @found smallint 
set @strDept = 'f18' 
set @strUser = 'Ted Lee' 

set @found = (SELECT count(*) 
       FROM syscolumns 
       WHERE id=OBJECT_ID('table1') AND name=''[email protected]+'') 

set @sql = 'select x, y, z from table1 where ' + @strDept + ' in ('''[email protected]+''')' 

if @found = 1 exec (@sql) 

SQL 주입 테스트 : SQL 바이올린 참조 : http://www.sqlfiddle.com/#!6/df3f6/18/0

+0

[1; DIROP TABLE USERS] – StingyJack

0

또 다른 대안은 PROC에서 대체의 작은 비트를 사용하는 것입니다. 여전히 동적 SQL을 사용하지만 사용자가 제공 한 값은 절대로 실행하지 않습니다.

DECLARE @userSuppliedValue VARCHAR(50) = 'JOHNNY DROP TABLES' 


DECLARE @substValue VARCHAR(50) 

IF @userSuppliedValue = 'Table1' 
    SET @substValue = 'Table1' 

IF @userSuppliedValue = 'Table2' 
    SET @substValue = 'Table2' 

/*Repeat for N permutations*/ 

/* Throw an error if you think its necessary to do so when no match is found*/ 
IF @substValue IS NULL 
    RAISERROR(1,1,'errah') 

EXEC ('SELECT * FROM ' + @substValue) 
+0

매우 흥미로운 방법론, 고마워요 :) – SyD

0
DECLARE @value varchar(10) 
SET @value = 'intStep' 
DECLARE @sqlText nvarchar(1000); 

SET @sqlText = N'SELECT ' + @value + ' FROM dbo.tblBatchDetail' 
Exec (@sqlText) 
관련 문제