2012-05-12 3 views
2

현재 자동 소스 코드 유효성 검사 도구를 작성하고 있습니다. 기본적으로 학생들은 C# 소스 코드 파일을 다른 작업을위한 솔루션으로 업로드해야합니다. 서버는 프레임 워크 내에서 이러한 파일을 컴파일하고 다른 입력 파일에 대해 프로그램을 검사합니다. 프로그램이 생성하는 출력이 유효하면 (미리 정의 된 출력과 동일) programm가 유효하고 학생이 프로그램에 대한 점수를 얻습니다.타사 코드 자동 컴파일 및 실행

하지만 나는 학생을 신뢰할 수 있다고 생각하지는 않습니다.) 서버에서 파일 액세스 권한을 얻거나 다른 나쁜 것을 실행하려고 할 수 있습니다.

최소 액세스를 제한하려면 어떻게해야합니까?
고려해야 할 사항은 무엇입니까?

  • 파일 액세스
  • 최대 :

    는 Allready 대해 생각했다. 실행 시간

  • 시작하는 다른 용 프로그램 물건을
  • 반사

네트워킹하고

  • 현재 내가 "파일", "인터넷"와 같은 키워드를 검색했다 상상할 수있는 코드를 확인하는 유일한 방법은, "프로세스", ... 정규 표현식 사용.

    그러나 저는 이것이 매우 안전하지 않다는 것을 확신합니다.
    제안 사항이 있으십니까?

  • +2

    그냥 다시 확인하려면 샌드 박스를 깨뜨린 학생에게 A +를 제공 할 계획입니까? 매우 수수께끼 당신이 그들에게 임무를하지 않을 것입니다. Anyhoo, 나는 기쁘게 그들의 이력서를 가져갈 것이다. –

    +0

    글쎄 대부분은 초보자지만 그들이 나아질 때 ... 학생이 샌드 박스를 깨고 서버에 정보를 텍스트 파일로 남겨 둘 수 있다면 모든 것이 잘되고 A +를 얻습니다. 그 (것)들이 서버를 부수기를 원하지 않는다. – raisyn

    답변

    1

    보안 측면이라면 샌드 박스에서 프로그램을 컴파일하고 실행해야합니다. 가상화 머신에 액세스 할 수있는 가상 머신을 생각해보십시오. 보안 악용을위한 소스 코드 검색은 상당한 과제처럼 들릴 수 있습니다. (학생이 코드를 올바르게 출력하면서 악용 할 수 있다면 솔직히 보너스 포인트를 고려해야합니다 : P)

    +0

    그게 솔루션 일텐데, 많은 오버 헤드가 있고 가상 머신에서 파일을 가져오고 나가기가 까다 롭습니다. 그리고 뭔가 잘못되었을 때 재시작합니다. – raisyn

    0

    매우 제한된 사용 권한을 가진 새 System.Diagnostics.Process 사용자로 컴파일을 실행하는 것입니다. 무한 루프와 같은 것을 막지는 못하지만 초심자 프로그래머조차도 우연한 무한 루프를 제출할 수 있기 때문에 직접 프로그램에서 수동으로 검사해야합니다. 당신이 로슬린 CTP를 사용하고자하는 경우

    http://www.curlybrace.com/words/2009/06/04/run-external-application-as-another-user-in-c/

    1

    , 당신은 Compilify 한 번 봐 걸릴 수 있습니다. 인프라 스트럭처를 확장 할 필요가 없으며 핵심 부분은 샌드 박스를 만드는 것입니다.

    0

    학생들의 출처를 편집하면 보안 위험이 발생하지 않지만 학생 코드를 실행하면 코드가 신뢰할 수 없으므로 샌드 박스가 필요합니다. AppDomains는이 용도로 사용할 수 있으며 특정 사용 권한 (예 : 실행 또는 FileIO)을 할당 할 수 있습니다. MSDN의 this article을 참조하십시오. 다른 스레드에서 대상 코드를 실행하는 기능을 추가하여 시간이 초과되면 중단 할 수 있습니다.

    학생들이 프로그램을 크래킹하는 것을 걱정하면 (예 : StackOverflowException이 발생하는 무한 재귀 호출) 상위 응용 프로그램과 통신 할 수있는 별도의 호스트 프로세스에서 위의 모든 작업을 수행해야합니다.msbuild를가 PROJ 파일의 작업을 통해 임의의 코드를 실행할 수

    업데이트

    사실, 컴파일은 문제를 제기 할 수있다. 나는 컴파일러 (csc.exe)를 실행하는 것이 문제가 될 것이라고 생각하지 않지만 명령 줄을 직접 만들어야합니다.