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