Skip to content

功能建议:将 OGNL 替换为 MVEL 以提升安全性和性能 #83

@Y2697741459

Description

@Y2697741459

问题描述

当前实现使用 OGNL (对象图导航语言) 来解析 SQL 参数。OGNL 存在已知的安全漏洞,例如远程代码执行 (RCE) 风险(例如,与 Apache Struts 相关的 CVE-2017-5638),这对应用程序安全构成了重大威胁。

此外,OGNL 在高负载或复杂表达式求值时有时会出现性能瓶颈。

解决方案

我建议将 OGNL 替换为 MVEL (MVFLEX 表达式语言)。MVEL 提供了几个引人注目的优势:

  1. 更强的安全性: MVEL 2.x (例如 2.4.12.Final2.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 定义应保持兼容。

这项更改将显著提高库的安全态势,并有可能提升其性能。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions