java - 模型驱动接口(interface)是否会在 struts2 中构成安全漏洞?

标签 java hibernate struts2 exploit

背景:我用 ModelDriven 编写了一个 struts2 ActionSupport 类。这是一个 hibernate/spring web 应用程序,在 View (JSP) 中使用 OSIV 和附加实体。

我今天收到了一封来自建筑师的电子邮件,因为我放置了一个物体而“惩罚”我 它通过 ModelDriven<E>界面。他是对的还是什么?显然,这是我正在做的一件严肃的事情,但我没有听从他的话,我真的不想接受他的提议,也不想在此之后去他的办公 table 前拜访他。好家伙。是时候改变职业了。

--- 来自建筑师---

Billy,正如我们之前讨论的那样,您在代码中仍然犯同样的错误 一遍又一遍地。这是你第四次犯这个错误,我很担心 关于你的工作质量。做一次甚至两次是一回事,但是 第四次之后,不知道你是不是听不懂我在说什么。下面就为你一一揭晓。如果您在阅读这封电子邮件后仍不明白,请到我的办公 table 前,我们将讨论一下。这必须立即停止,我想要所有 您的代码在当天结束前重构,更正了这个错误。如果任何代码像 这会渗入生产中,我们将面临严重的安全问题。另请注意,我正在抄袭戴夫,以便发出适当的谴责。我还将向 Dave 建议将您从 III 级开发人员转移到 II 级开发人员。请阅读以下内容并学习它,并按照我的指示重构您的所有代码。

关于绑定(bind)对象:

当一个Struts2的action类标有ModelDriven接口(interface)时,模型 将绑定(bind)到 HTML 页面中的表单元素。例如,如果一个 HTML 表单 有一个名为 userName 的字段和一个操作类定义为:

公共(public)类 UserAction 扩展 ActionSupport 实现 ModelDriven

而 UserModel 是一个 POJO,如下所示:

public class UserModel {
  private String userName;

  public String getUserName() {
      return userName;
  }

  public void setUserName(String userName) { 
      this.userName = userName;
  }
}

提交表单时,只要Action中包含UserModel的实例,struts2 将字段 userName 绑定(bind)到 UserModel.userName,自动填充值。

但是,对于恶意用户来说,这种简单性需要付出高昂的代价。如果声明了一个对象 作为 ModelDriven,最终用户,即浏览用户,可以访问模型图 通过模型 setter 。以这个案例为例:

公共(public)类 UserAction 扩展 ActionSupport 实现 ModelDriven

和...

public class UserModel {
  private String userName;
  private UserEntity userEntity;

  public String getUserName() {
      return userName;
  }

  public void setUserName(String userName) { 
      this.userName = userName;
  }

  pubic UserEntity getUserEntity() {
      return userEntity;
  }
}

和...

@Entity
public class UserEntity {
    private String password;

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
 }

假设正在使用 OSIV 模式,并且附加了实体 UserEntity。

有一点先见之明或手头有时间的狡猾用户可能会:

/myform?userName=billy&userEntity.password=newpassword

假设实体在 session 结束时被保存,上面的结果会改变 比利的密码。

重点是,对象图可用!

当使用 ModelDriven 并且使用替代方法是一种可怕的方法时,您必须定义 放置在值堆栈上的细粒度模型,然后从模型复制到 发送响应并允许事务提交之前的目标对象。

最佳答案

您的架构师是对的,将可以访问敏感信息的对象放在 ValueStack 上会带来潜在的安全风险。恶意用户确实可以通过上述攻击重置密码。

但是:

既然他是一名架构师,他应该设计出正确验证/限制输入参数的方法。使用 Struts2 中的 ParamsInterceptor 可以很容易地只允许将特定参数传递给操作。因此,糟糕的不是你的工作,而是你的系统架构。 开发人员应该能够专注于实现业务逻辑。基础架构必须由架构师提供。

干杯,

w

关于java - 模型驱动接口(interface)是否会在 struts2 中构成安全漏洞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3337935/

相关文章:

java - Spring boot [s0] 连接到节点时出错(endPoint=127.0.0.1 :9042, hostId=null,>

java - WAS Liberty 8.5.5.7 是否支持邮件资源配置?

java - 从单个表单插入多个实体

javascript - Struts Iterator 每个 div 放置 3 个项目

java - 访问 GridPane 节点时出现问题

java - 每次运行程序时出现NumberFormatException错误如何解决?

java - hibernate ,SQL Server 2016 = SQL 错误 : 207 - Invalid column name

java - Gson 与 Hibernate - 尝试加载惰性属性时出错

java - 如何在Hibernate中定义非生成的主键字段

java - Struts2中的TokenSession拦截器