首页 > 解决方案 > SPEL如何防范注入攻击

问题描述

像这样的一些代码

    StandardEvaluationContext context = new StandardEvaluationContext();
    context.addPropertyAccessor(new EmptyValueMapAccessor());
    context.addPropertyAccessor(new MapAccessor());
    context.addPropertyAccessor(DataBindingPropertyAccessor.forReadOnlyAccess());
    ExpressionParser paser = new SpelExpressionParser();
    Expression expression = paser.parseExpression("#{T(java.lang.System).exit(0)}", new TemplateParserContext());
    expression.getValue(context,obj);

它将执行exit方法。

标签: javaspringelspring-el

解决方案


改用 a SimpleEvaluationContext- 它是专门为此目的而设计的。

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#expressions-evaluation-context

SimpleEvaluationContext旨在仅支持 SpEL 语言语法的一个子集。它不包括 Java 类型引用、构造函数和 bean 引用。它还要求您明确选择对表达式中的属性和方法的支持级别。默认情况下,create() 静态工厂方法只允许对属性进行读取访问。您还可以获得构建器来配置所需的确切支持级别,针对以下一项或某种组合:

  • 仅自定义 PropertyAccessor(无反射)
  • 只读访问的数据绑定属性
  • 用于读取和写入的数据绑定属性

推荐阅读