2017-03-25 33 views
0

자바 코드를 텍스트 형식으로 생성하는 함수 (템플릿 엔진과 비슷한 기능)가 있으면 코드 제공을 방지하기 위해 사용자 제공 필드를 어떻게 위생 처리합니까? 인스턴스의Java 생성 코드에 대한 사용자 입력을 sanitize하는 방법은 무엇입니까?

, 내가 유사한 템플릿을 사용하고있는 경우 :

void function_${user_provided_function_name}() { 
    // Do stuff 
}; 

그리고 사용자가 입력 (){System.exit(0);}; void function_dummy로 제공, 생성 된 코드는 다음과 같습니다

void function_(){System.exit(0);}; void function_dummy() { 
    // Do stuff 
}; 

을 난 경우에도 괄호를 허용하지 않으려 고 (함수 호출을 방지하기 위해) 유혹을 받았다. 당신이 (같이) 코드를 컴파일 가능한을 만들기 위해 사용자 입력의 유효성을 검사 하려면

+0

제공된 문자열이 [유효한 식별자]인지 확인할 수 있습니다 (http://stackoverflow.com/questions/12857340/naming-restrictions-of-variables-in-java). – assylias

+1

나는 그렇지 않다. 사용자가 제공 한 소스 코드를 안전하게 실행하기위한 이러한 접근 방식은 잘못되었습니다. 허용 된 일련의 개체 및 메서드 만 사용할 수 있도록 보안 샌드 박스에서 실행해야합니다. http://stackoverflow.com/questions/1715036/how-do-i-create-a-java-sandbox를 참조하십시오. – slim

답변

1

, 당신은 user_provided_function_name에 세 가지 사항을 확인해야합니다 :

  • 어휘 검사 : 그것은 유효한 Java 식별자해야합니다 : 시작 문자로, $ 또는 밑줄 _을 입력 한 다음 문자, 달러, 밑줄 또는 숫자가 0 회 이상 올 수 있습니다.
  • Sintactical 검사 : 그것은 자바 키워드 안 : for, while, class, abstract, void
  • 의미 론적 확인 : 그것은 java.lang.Object에서 방법이 아니어야합니다 : (toString, notify, getClass 등 어느 쪽도 없습니다 수퍼 클래스에서 오버라이드 할 수없는 메소드).

첫 번째 규칙을 수행하려면 정규식을 사용하면됩니다. 단일 세트는 다른 두 규칙에 대해 수행합니다.

사용자 입력을 수정하려는 경우에도 위의 첫 번째 규칙에 따라 잘못된 문자를 모두 삭제하여 올바른 Java 식별자로 만든 다음 다른 두 규칙을 적용해야합니다.