Skip to content

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

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 定义应保持兼容。

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions