2012-01-18 2 views
2

나는 사용자가사용자가 입력 한 C# 코드를 안전하게 만드는 방법은 무엇입니까?

someFieldValue == "someValue" 

같은 식을 입력 할 수있는 조건부 서식 기능을, 건물입니다 그리고 우리는 그 표현의 결과에 따라 서식을 적용. 완전한 표현식 구문을 사용하여이를 수행하는 가장 빠른 방법은 CSharpCodeProvider.CompileAssemblyFromSource 인 것으로 보입니다.

표현식은 사용자가 입력하기 때문에 엄청난 보안 허점입니다 (예 : 사용자가 someFieldValue == Process.Start("shutdown","/s /t 0")이라는 표현식을 입력 할 수 있음).

질문 : 이것은 생산 시스템이었다 경우, 내가 입력 한 표현이 문제가 발생하지 않도록 수있는 방법? 지금은 내부 도구 일 뿐이지 만 프로덕션 시스템에이 스크립트를 공개하는 경우 준비가 필요하고 나중에 경로를 지정하지 않고 (C# CodeDom) 나중에 코드를 스크랩합니다. 안전하지 않은 것으로 간주 될 수

어떤 것들은 :

  • 응용 프로그램을 종료
  • 액세스/파일/레지스트리/시스템 설정과 같은 지역 자원을 수정 호출 프로세스를 충돌 메모리
  • 의 개체를 수정
  • 실행 응용 프로그램
  • ...
  • 당신 이 할 수있는 모든 일을 열거하는 불합리한 이래로

, 내 느낌은이 모든 기능 우리가 기꺼이를 노출 프록시 개체에서 작동하도록 솔루션은 사용자가 입력 한 표현을 수정 포함 것입니다 표현에 노출된다. 이는 표현식에서 임의의 함수 호출을 허용하지 않는다는 것을 의미합니다. 또한 표현식이 더 이상 표준 C# 코드가 아니며 결국 결국 다른 언어 구문을 사용하는 것이 더 실용적 일 수 있음을 의미합니다.

C#을 사용할 수 있다는 이점은 HUGE입니다. 표현식에 사용할 수있는 "플러그인"을 허용하고 기존 코드와의 완벽한 통합을 허용하기 때문입니다. 한 가지 해결책은 javascript와 같은 스크립팅 언어를 사용하는 것이지만, 먼저 C#을 배제해야한다는 것을 알고 싶습니다.

+0

아마도 DynamicExpression을 사용하여 설정된 수의 연산자/표현식을 허용 할 수 있습니다. 또는 더 일반적으로, 표현식 문자열을 구문 분석하여 표현식 트리로 만드십시오. 여기에 허용 된 노드 목록이 있습니다. –

+0

당신은 자신을 공격하는 사용자를 묘사하고 있습니다 *. 사용자는 자신을 공격 할 수 있습니다. 왜이 구멍이 보안상의 구멍입니까? –

+1

웹 서버. 표현식은 클라이언트에 의해 입력되지만 제한되지 않은 액세스로 인해 서버에 혼란을 야기 할 수 있습니다. 잠시 동안은 내부 용도로만 사용되므로 문제가되지 않지만 생산 단계에서는 용납 될 수 없습니다. AppDomain은 문제를 해결했습니다. – tenfour

답변

2

나는 이것에 대해 살펴 봐야한다고 생각한다;

Assembly.CreateInstance and security

이 권장되는 방법

는 샌드 박스 응용 프로그램 도메인에서 용의자 코드를 실행하는 것입니다. http://blogs.msdn.com/b/shawnfa/archive/2006/04/19/579066.aspx에는 몇 가지 이유가 있으며, 더 중요한 것은 의 대부분이 .NET 4.0에서 더 이상 사용되지 않는다는 것입니다.

+2

고마워요 - 이제 구현했습니다. 실제로 AppDomains는 제가 찾고있는 것입니다. 관심있는 사람들에게 좋은 자료는 [이 기사] (http://msdn.microsoft.com/en-us/library/bb763046.aspx)입니다. – tenfour

관련 문제