문자열로 제출된 저장된 프로세스를 실행하지 않도록 SqlServer를 구성할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1446629

문제

시나리오 A:

SqlConnection con = new SqlConnection(myConnString);
SqlDataAdapter adp = new SqlDataAdapter("EXEC spGetUserInfo 42", con);
DataSet ds;
adp.Fill(ds);

시나리오 B:

SqlConnection con = new SqlConnection(myConnString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "spGetUserInfo";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@UserID", 42));
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataSet ds;
adp.Fill(ds);

질문

데이터베이스를 호출하는 기본 애플리케이션 코드를 수정하는 것과 별도로 SQL 삽입 공격으로부터 SqlServer를 강화하는 방법에 대한 논의에서 SqlServer가 시나리오 A 방식으로 작성된 저장된 프로시저를 실행하지 않고 실행 요청만 허용하도록 구성할 수 있는지 여부에 대한 의문이 제기되었습니다. 시나리오 B의 방식으로 작성되었습니다.이론에 따르면 기본 앱이 입력 유효성 검사를 수행하지 않으면 시나리오 A가 주입에 취약하여 "EXEC spGetUserInfo 42;데이터베이스 foo 삭제;--"가 실행될 가능성이 있지만 시나리오 B는 SqlServer가 "42;데이터베이스 foo 삭제;--"를 정수로 변환합니다.

시나리오 A 방식으로 호출된 저장 프로시저를 실행하지 않도록 SqlServer를 구성할 수 있습니까?

도움이 되었습니까?

해결책

내가 아는 한, 나는 그것을 할 수 있는 방법을 찾기 위해 꽤 열심히 노력해 왔습니다.

제가 생각할 수 있는 가장 가까운 방법은 어떻게든 네트워크를 사용하여 무언가를 수행하는 것입니다. 오직 ".StoredProcedure" 호출은 일반적으로 RPC를 통해 이루어지지만 동적 SQL 요청은 그럴 수 없으므로 SQL Server에 대한 RPC 연결이 허용되었습니다.그러나 그것이 가능한지 알기에는 네트워크 관리 및 서버 관리에 대해 충분히 알지 못합니다.

또 다른 (더 표준적인) 접근 방식은 단순히 사용자/앱에 오직 데이터베이스에 대한 CONNECT 액세스는 가능하지만 데이터베이스의 모든 개체에 대한 액세스는 불가능합니다.그런 다음 자체 SCHEMA에 저장 프로시저를 만들고 소유자/스키마에 데이터베이스 개체(테이블, 뷰, 기타 ​​저장 프로시저 등)에 대한 일반 액세스 권한을 부여합니다.마지막으로 사용자에게 해당 스키마의 저장 프로시저에 대한 EXECUTE 액세스 권한을 부여합니다.이것이 여전히 가능한 모든 동적 SQL 시나리오를 방지하지는 못하지만 위험을 제거합니다(그리고 대부분의 요점도 지적합니다).

다른 팁

확률은 SQL Server 데이터베이스 엔진으로 인해 발생하지 않습니다. 그 이유는 SQL 서버가 해당 명령이 SQL 서버에 들어올 때 알 수있는 한 명령이 기본적으로 동일하기 때문입니다. 클라이언트 컴퓨터의 드라이버는 서식입니다.

데이터베이스 엔진을 SQL 주입로부터 보호하는 유일한 방법은 애플리케이션 계층에서 처리하는 것입니다.

편집 : 나는 수정되었고, 돌아가서 TDS 표준을 여기에서 읽었습니다.

http://www.sybase.com/content/1040983/sybase-tds38-102306.pdf

tds_language 명령 하다 와이어를 통해 기본 매개 변수를 지원하므로 실제로 SQL Server가 매개 변수화 된 쿼리를 수신하는 방법입니다.

방법이 있는지 여부에 관해서 매개 변수를 사용하고 CommandText에서 인수를 허용하지 않으면 그렇게하는 방법을 모릅니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top