消除 Spring 咒语中的漏洞

lpwwtiir  于 2023-01-16  发布在  Spring
关注(0)|答案(1)|浏览(115)

我正在测试Spring Spel,我在想是否有可能以某种方式限制可以提供的Spel查询类型,以避免一些不必要的代码注入?我只是想从某个对象中获取值,那么是否有可能阻止其他类型的操作?我在Spring文档中找不到这样的功能。
例如,我只想允许检查 test 对象的值是否等于XYZ。

Test test = new Test("XYZ", 999);
ExpressionParser expressionParser = new SpelExpressionParser();
Expression expression = expressionParser.parseExpression("value eq 'XYZ'");

System.out.println(expression.getValue(new StandardEvaluationContext(test)));

然而,我想限制哪些表达式是有效的。我不知道如何计算允许执行某些代码的表达式,例如:

Expression expression = expressionParser.parseExpression("''.getClass().forName('java.lang.Runtime').getMethods()[6]");
bvjveswy

bvjveswy1#

正如@ArtemBilan在评论中提到的,限制SpEL语言语法和消除不必要代码执行的解决方案是使用SimpleEvaluationContext类,例如:

SimpleEvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding()
.withInstanceMethods()
.withRootObject(test)
.build();

相关问题