2014-12-10 3 views
3

Groovy in ActionSecureASTCustomizer을 통해 DSL에 보안을 제공하기위한 다음 코드를 제공합니다.Groovy에서 DSL 허용 목록 구현

// @author: Groovy in Action 
import org.codehaus.groovy.control.* 
import org.codehaus.groovy.control.customizers.* 

def secure = new SecureASTCustomizer() 

secure.with { 
        closuresAllowed = false 
        methodDefinitionAllowed = false 
        importsWhitelist = [] 

        staticImportsWhitelist = [] 
        staticStarImportsWhitelist = ['java.lang.Math'] 

        tokensWhitelist = [ 
        PLUS, MINUS, MULTIPLY, DIVIDE, MOD, POWER, 
        PLUS_PLUS, MINUS_MINUS, 
        COMPARE_EQUAL, COMPARE_NOT_EQUAL, 
        COMPARE_LESS_THAN, COMPARE_LESS_THAN_EQUAL, 
        COMPARE_GREATER_THAN, COMPARE_GREATER_THAN_EQUAL, 
        ] 

        constantTypesClassesWhiteList = [ 
        Integer, Float, Long, Double, BigDecimal, 
        Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE 
        ] 

        receiversClassesWhiteList = [ 
        Math, Integer, Float, Double, Long, BigDecimal 
        ] 

        statementsWhitelist = [ 
        BlockStatement, ExpressionStatement 
        ] 

        expressionsWhitelist = [ 
        BinaryExpression, ConstantExpression, 
        MethodCallExpression, StaticMethodCallExpression, 
        ArgumentListExpression, PropertyExpression, 
        UnaryMinusExpression, UnaryPlusExpression, 
        PrefixExpression, PostfixExpression, 
        TernaryExpression, ElvisOperatorExpression, 
        BooleanExpression, ClassExpression 
        ] 
} 

def config = new CompilerConfiguration() 
config.addCompilationCustomizers(secure) 

def shell = new GroovyShell(config) 

x = shell.evaluate ''' 
    5 + 10 
    println("exiting...") 
    System.exit(0) 
''' 

println x 

그러나이 코드를 실행하면 런타임 오류가 발생합니다.

예제를 작동 시키려면 오류를 해결할 수 있습니다. 예 : System.exit(0)과 같은 다른 유형의 명령을 허용하지 않는 수학 연산을 수행하는 DSL입니다.

>groovy WhiteListSimple.groovy 
Caught: groovy.lang.MissingPropertyException: No such property: PLUS for class: org.codehaus.groovy.control.customizers.SecureASTCustomizer 
groovy.lang.MissingPropertyException: No such property: PLUS for class: org.codehaus.groovy.control.customizers.SecureASTCustomizer 
     at WhiteListSimple$_run_closure1.doCall(WhiteListSimple.groovy:14) 
     at WhiteListSimple.run(WhiteListSimple.groovy:6) 

답변

2

PLUS과 친구

import static org.codehaus.groovy.syntax.Types.* 

에있다 그리고 당신은 또한이 책은 2009 년부터이다,

import org.codehaus.groovy.ast.stmt.* // for the classes in `statementsWhitelist` 
import org.codehaus.groovy.ast.expr.* // for the classes in `expressionsWhitelist` 

감안할 필요하면 범위의 그루비 바로 지금 사용하는 2.3에서 패키지/클래스 위치는 단순히 시간이 지남에 따라 변경되었거나 소스 코드가 처음에는 작동하지 않았습니다.

클래스를 찾고/import을 만드는 데 도움이되는 IDE를 고려해 볼 수 있습니다.