2013-01-02 3 views
2

인 매개 변수화 C#의 ODBC 드라이버에 대한 OdbcConnection에 대한 매개 변수화 된 SQL 쿼리를 수행하는 데 문제가 있습니다. 나는 그것이 columname "사용자가"확인 보인다 위해 odcparameters를 사용하여 주사OdbcCommand. 테이블 이름이

using (OdbcCommand command = connection.CreateCommand()) 
{ 
    command.CommandText = "SELECT ? FROM ?"; 
    command.CommandTimeout = SynchTimeout; 
    command.CommandType = CommandType.Text; 

    command.Parameters.Add(new OdbcParameter(string.Empty, "User")); 
    command.Parameters.Add(new OdbcParameter(string.Empty, "TableName")); 

    OdbcDataReader reader = command.ExecuteReader(); 
    while (reader.Read()) 
    { 
     // TODO: Do something clever.. 
    } 
} 

로부터 보호 할 수 있도록 열 이름과 테이블 이름은 웹 GUI에서 구성 할 수 있습니다. 하지만 테이블 이름을 매개 변수로 '?' 다음 오류가 발생합니다. 오류 [HY000] [Microsoft] [ODBC Excel 드라이버] 매개 변수 'Pa_RaM002'는 테이블 이름이 필요한 곳에 지정되었습니다.

누군가 OdbcParameter가 될 수없는 경우이 상황에서 테이블 이름을 안전하게 전달하는 방법을 알고 있습니까?

+1

Jet/ACE 드라이버에서 테이블 매개 변수를 사용할 수 없습니다. – Fionnuala

답변

1

SQL에서 테이블 이름과 열 이름을 매개 변수화하는 것이 가능하지 않다고 생각합니다. 그래서, 어떤 식 으로든 다른 식 으로든 당신은 여전히 ​​동적 SQL 문을 만들기 위해 문자열 연결에 의존 할 것입니다.

명세서를 실행하기 전에 몇 가지 검사를 수행하는 것이 가능합니다. ,

1. 화이트리스트 검사 (더 나은 솔루션)

가능하면이 방식으로 사용할 수 있도록 테이블과 컬럼의 목록을 가지고 : 나는 두 당신이 수행 할 수있는 검사의 유형을 참조하십시오. 사용자가 테이블과 열을 지정하면 목록의 요소 만 허용해야합니다.

2. 동적 검사

이 테이블/컬럼의 이름이 사전에 (예 : 동적으로 생성 된) 알 수없는 경우에만이 방법을 적용 (위험한 용액)하고 화이트리스트를 구축하는 것은 불가능합니다 . 그렇지 않으면 화이트리스트 접근 방식으로 이동하십시오.

구성된 테이블과 열이 데이터베이스에 있는지 확인할 수 있습니다. SQL Server를 사용하는 경우

예를 들어, 당신과 같이, the Information Schema views를 조회하여이 작업을 수행 할 수 있습니다 : 너무 자주 검사를 실행 방지하기 위해

select top 1 COLUMN_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME = @tableNameParameter 
and COLUMN_NAME = @columnNameParameter 
and <additional criteria*> 

, 당신은 웹에서 검증 이러한 검사를 수행 할 수 페이지 및 테이블 이름을 구성 할 수 있습니다.

* 경고 : 테이블과 열의 유효성 만 검사하면 사용자가 데이터베이스의 모든 테이블을 검색 할 수 있습니다. 이를 방지하기 위해 SQL에 추가 기준을 추가하여이 방식으로 사용하려는 테이블 만 선택하도록 할 수 있습니다. 예를 들어, 모든 동적 테이블이 특정 접두사를 가질 수있다, 그래서 당신은 상관없이 당신이 선택하는 솔루션의 [...] and TABLE_NAME like 'prefix%'


을 할 수있는, 그것은 보안 관점에서 중요하다고 인식. 시스템의 어떤 구성 요소가 사용자 지정 테이블/열 값을 쓰고 이러한 각 지점에서 유효성 검사를 적용 할 수 있는지 매우 신중해야합니다.

+0

좋은 답변과 제안. 화이트리스트 만이 이것을 안전하게 할 수있는 유일한 방법입니다 – Greg

+0

@ 그렉 감사에 감사드립니다.화이트리스트 접근법의 중요성을 강조하기 위해 필자의 대답을 편집했습니다. – GolfWolf

+0

답변 해 주셔서 감사합니다. 그것은 많은 것을 설명합니다! – user1943197