2010-04-14 3 views
7

리플렉션을 통해 플러그인을로드 할 수있는 웹 응용 프로그램이 있습니다. 이 작업을 수행하기 위해 현재 Assembly.LoadFrom()Activator.CreateInstance()을 사용하고 있습니다. 현재 플러그인은 동일한 AppDomain에로드되며 내 앱 및 내 앱이 액세스 할 수있는 모든 것에 액세스 할 수 있습니다..net 플러그인이 액세스 할 수있는 내용 제한

내가 찾고있는 것은 플러그인이 보안을 위해 액세스 할 수있는 클래스와 메서드를 제한하는 방법입니다. 허용 된 클래스가 아니라면 호출 될 때 모든 클래스와 메서드가 예외를 throw하도록하고 싶습니다. 기본적으로 API 클래스의 모든 함수와 몇 가지 데이터 전송 객체를 허용 목록에 추가합니다.

또한 플러그인이 파일 시스템이나 데이터베이스에 액세스 할 수 없도록하고 싶습니다. 비록 내가 별도의 AppDomain에서 신뢰 수준으로 할 수 있다고 생각합니다.

좋은 아이디어 나 자료가있는 사람이 있습니까? 이것은 코드 액세스 보안 또는 .net 4의 새로운 보안 투명 코드 기능으로 수행 할 수있는 것입니까?

+0

사이트를 안정화시키는 데 책임이있는 시스템 관리자가 없다고 생각합니다. 누가 플러그인을 추가합니까? 고객? –

+0

고객이 실시간 사이트에 직접 플러그인을 업로드하는 것을 허용하지 않습니다. 그러나 우리는 고객이 우리에게 제공하고 사이트에 직접 플러그인을 추가 할 계획입니다. 그리고 DLL을 해체하지 않고 수동으로 확인하지 않으면 100 % 신뢰할 수 있을지 확신 할 수 없습니다. –

답변

3

일반 액세스 제한을 적용하려는 경우 별도의 AppDomain을 사용하는 것이 올바른 방법입니다. 앱 특정 로직에 대한 액세스를 제한하는 것과 마찬가지로 '앱 내부'서비스 오브젝트의 인스턴스를 플러그인 오브젝트에 제공하지 마십시오. 또한 MarshalByRef가 아닌 참조 형식 개체는 AppDomain 경계를 넘지 않으므로 개체를 반환하려고하는 노출 된 메서드가 있어도 액세스가 안전합니다.

+0

이것은 유망한 것처럼 들리지만, 플러그인이 정적 메서드를 호출하거나 객체의 새 인스턴스를 만드는 것을 멈추게하는 것은 무엇입니까? 나는 플러그인이 연결 문자열과 같이 보이면 안되는 정보를 얻을 수 있을지 걱정하고 있습니다. –

+1

확장 기능을 안전하게 통합 할 수있는 디자인을 만드는 것은 간단합니다. 개체의 인스턴스화 또는 정적 멤버에 대한 액세스를 방지 할 수는 없지만 원래 AppDomain의 실제 인스턴스에 대한 액세스를 완전히 제어 할 수는 있습니다. 플러그인은 사용자가 명시 적으로 마샬링하는 인스턴스 만 가져옵니다. 핵심은 클래스를 인스턴스화하는 플러그인이 애플리케이션 상태가 변경 될 수 없도록해야한다는 것입니다. 아무도 실제 애플리케이션 상태에 대한 참조를 얻을 수 없기 때문입니다. 다른 간접적 인 부작용 (파일 시스템 또는 OS 액세스)은 AppDomain 보안 설정을 통해 제어됩니다. –

0

저는 보통 신뢰할 수있는 사람이 더 많으므로
이라는 별개의 앱 도메인으로 이동 하겠지만 귀하의 질문에 따르면 나는 당신이 조금 더 피곤한 것 같아요.

정말로 안전하고 싶다면 플러그인을 별도의 프로세스에로드하고 플러그인 인터페이스를 "프로세스 간"브리지에 제공하면 필요한 작업 만 수행 할 수 있습니다.

이 방법을 사용하면 플러그 인을 사용하려는 대상에만 옵트 인 할 수 있습니다.

또한이 데몬 프로세스를 syscalls, 파일 시스템 및 환경에 대한 액세스가 제한적인 "약한"사용자로 쉽게 시작할 수 있습니다.