功能建议:将 OGNL 替换为 MVEL 以提升安全性和性能
- Dominant language
- Java
- Stars
- 230
- Forks
- 176
- PR merge metrics
- No merged PRs in 30d
Description
#### **问题描述**
当前实现使用 OGNL (对象图导航语言) 来解析 SQL 参数。OGNL 存在已知的安全漏洞,例如远程代码执行 (RCE) 风险(例如,与 Apache Struts 相关的 CVE-2017-5638),这对应用程序安全构成了重大威胁。
此外,OGNL 在高负载或复杂表达式求值时有时会出现性能瓶颈。
#### **解决方案**
我建议将 OGNL 替换为 **MVEL (MVFLEX 表达式语言)**。MVEL 提供了几个引人注目的优势:
1. **更强的安全性:** MVEL 2.x (例如 `2.4.12.Final` 或 `2.5.2.Final`) 在设计上就更加安全。它不像 OGNL 那样存在固有的任意代码执行漏洞。其默认的沙箱功能提供了更好的防护,可以抵御恶意表达式。
2. **性能:** MVEL 通常比 OGNL 性能更好,尤其是在解析 SQL 参数这种常见的简单表达式时。
3. **语法兼容性:** MVEL 访问 Map 值 (`map.key`) 和嵌套属性 (`map.nestedKey.value`) 的语法与 OGNL 非常相似,这使得迁移过程相对简单。这对于使用 `:paramName` 或 `:nested.paramName` 这种格式定义 SQL 占位符的现有用户来说,可以保持一致性。
4. **轻量级依赖:** MVEL (`mvel2` 工件) 是一个轻量级的库。
#### **备选方案考虑**
虽然 Spring 自己的 SpEL (Spring 表达式语言) 也是一个选项,但在 `minidao-pe` 所使用的 Spring Framework 5.3.x (由 Spring Boot 2.7.18 使用) 中,安全地集成它需要仔细配置 `StandardEvaluationContext` 并使用 `#root.key` 语法,这比 OGNL/MVEL 直接使用的 `map.key` 语法更复杂、不直观。
#### **附加信息**
- **安全顾虑:** 迁移离开 OGNL 解决了与表达式语言注入相关的关键安全问题。
- **迁移路径:** 此更改主要会影响 `installPlaceholderSqlParam` 方法或类似方法内部的表达式求值逻辑。如果键提取逻辑保持不变,则使用 `:` 占位符的现有 SQL 定义应保持兼容。
这项更改将显著提高库的安全态势,并有可能提升其性能。
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.