2010-03-30 8 views
1

SqlCommand를 사용하여 RPC를 통해 저장된 proc을 호출 할 때 현재 데이터베이스가 아닌 다른 데이터베이스에서 저장된 proc을 호출 할 수있는 것처럼 보입니다.SqlCommand - 다른 데이터베이스에서 저장된 proc 호출을 방지하는 경우

:

string storedProcName = "SomeOtherDatabase.dbo.SomeStoredProc";  
SqlCommand cmd = new SqlCommand(storedProcName); 
cmd.CommandType = CommandType.StoredProcedure; 

나는 다른 데이터베이스에 대한 잠재적 호출을 금지함으로써 내 DAL 코드를 더 제한적으로 만들고 싶습니다. 한 가지 방법은 위의 storedProcName에 두 개의 마침표 (점)가 있는지 확인하는 것입니다. 그렇다면 예외를 throw합니다. 다른 아이디어/접근법?

감사합니다.

+2

데이터베이스 서버 측? – hallie

+0

좋은 생각인데, 우리는 그것을 트랙 아래로 할 것입니다 (많은 데이터베이스가 있기 때문에 우리의 경우에 설정하는 것이 약간 일 것입니다). 그러나 나는 DAL에 수표를 넣는 아이디어를 좋아한다. 왜냐하면 내가 비교적 쉽게 확인해야한다고 생각했기 때문이다. –

답변

3

일반적으로 이러한 제한은 서버 측에서 구성됩니다.
SQL Server는 매우 광범위한 보안 모델을 제공하므로 특정 데이터베이스 개체 (테이블, 데이터베이스 또는 응용 프로그램)에 대한 특정 "주체"(사용자 또는 그룹)에 특정 사용 권한 ("읽기", "쓰기" 뷰, 저장 프로 시저, 스키마 ...)

ADO 연결과 관련된 기본 데이터베이스 외부에서 저장 프로 시저를 사용하지 못하도록 DAL 계층에 몇 가지 제한 사항을 적용하는 것이 좋습니다. "SQL로 보내지는 것". 일반적으로 이것은 (SQL 삽입을 막는 등) 가치있는 태도이지만,이 경우에는 다음과 같이 권고합니다 :
미래의 특정 "외부"저장 프로 시저가 필요할 경우 어떻게해야합니까? 또한 현재 데이터베이스에 저장 프로 시저가 여러 개있는 경우 (유지 관리/데이터 로딩/감사/다른 용도로만 사용되기 때문에 애플리케이션에 대해 오프 리밋이어야 함)? 몇 가지 DAL 수준 제한을 도입하면 나중에 어려움을 겪을 수 있으며 액세스 제어가 적절하지 않을 수도 있다고 생각할 수 있습니다.

1

이름에 점 데이터베이스의 절차가있을 수 있습니다 :

는 할리 당신이 적절하게 계정이 무엇이든을 위해 다른 데이터베이스에있는 모든 권한을 부여하지 (서버 보안에 더 낫다라고
create procedure dbo.[Dots.In.Name] 
as 

으로 SqlConnection에 의해 사용됨).

2005 년 또는 2008 년 데이터베이스를 다루는 경우 현재 데이터베이스에 다른 데이터베이스를 참조하는 동의어가있을 수 있습니다. 물론 현재 데이터베이스의 모든 저장 프로 시저가 저장된 프로 시저를 호출 할 수 있습니다. 다른 서버/데이터베이스.

기본적으로 데이터베이스 서버 (생성되는 개체 및 사용 권한 제어)를 제어하고 서버가 현재 적절하게 대응할 수있는 사례를 처리하기 위해 적은 코드를 작성합니다.

+0

우리는 저장된 proc 이름을 완벽하게 제어 할 수 있으므로 점이있는 저장된 proc 이름이 없다고 가정 할 수 있습니다. (무엇이라도 발견하면 개발자 )에게 불쾌한 행동을해야합니다. 그 말은 마치 서버가 일반적인 합의라고 생각하는 것처럼 보입니다. –

+0

@Moe - 어쨌든 서버를 보호해야합니다.이 옵션을 사용하면 작업이 줄어 듭니다. –

관련 문제