java - 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
方法。
解决方案
改用 a SimpleEvaluationContext
- 它是专门为此目的而设计的。
SimpleEvaluationContext
旨在仅支持 SpEL 语言语法的一个子集。它不包括 Java 类型引用、构造函数和 bean 引用。它还要求您明确选择对表达式中的属性和方法的支持级别。默认情况下,create() 静态工厂方法只允许对属性进行读取访问。您还可以获得构建器来配置所需的确切支持级别,针对以下一项或某种组合:
- 仅自定义 PropertyAccessor(无反射)
- 只读访问的数据绑定属性
- 用于读取和写入的数据绑定属性
推荐阅读
- php - preg_match_all 不适用于所有 php 7 版本
- java - Gradle/JUnit 对并行分叉的测试分配不平衡
- gradle - 错误:无法访问 jarfile build/libs/gs-spring-boot-0.1.0.jar?
- ios - 来自 CMSampleBufferRef 的图像始终为白色
- c# - 如何通过与数据源不同的文本过滤 ASPxGridView
- javascript - 回复博客按钮 HTML jQuery 追加问题
- bash - SSH 仅对文件的新更新版本(但不替换目录)
- math - 如何用 Bresenham 算法绘制椭圆扇区?
- groovy - Groovy 创建动态 json 时没有此类属性错误
- javascript - 如何在节点红色中设置环境变量?