【问题标题】:Protect specific fields when binding in Spring在 Spring 中绑定时保护特定字段
【发布时间】:2011-06-28 17:04:33
【问题描述】:

我正在处理允许用户编辑个人资料信息的页面。我希望他们能够编辑他们的公共信息,但不允许他们更改系统标志,例如他们的用户类型。

这是使用 Spring MVC (3.0) 实现的。 User 对象具有典型的字段,例如 firstNamelastNameemail(都应该是可编辑的)和一个布尔值 administrator(不应是可编辑的。

我的方法看起来像这样:

@RequestMapping(method = RequestMethod.POST)
public String doEdit(
        @ModelAttribute("user") User user,
        BindingResult result,
        ModelMap model)
throws IOException
{
      // validate, blah blah
      // save user object
      // return page

}

我的表单包含firstNamelastName 等字段,似乎工作正常。

问题在于,如果恶意用户发布带有参数administrator 为“true”的查询,他们可以在不应该设置此字段时设置此字段。

我知道我可以创建一个单独的“表单”对象,其中只包含我想要更改的字段并将其用于自动绑定。 (数据的副本)。问题是我有很多地方使用这种技术。 (对于用户和其他对象)。当我想添加字段时,维护起来很麻烦。

有没有办法在 Spring MVC 中使用注解或其他技术来将参数列入白名单并防止更改任意域对象属性?

【问题讨论】:

  • 只是一个历史轶事,Spring 在这方面非常松散,恶意用户可以将“class.classLoader.URLs[]”注入任何模型对象,完全控制服务器。 springsource.com/security/cve-2010-1622
  • 我大吃一惊。我上周刚刚在生产环境中从 Spring 3.0.2 升级到 Spring 3.0.5。

标签: java spring spring-mvc


【解决方案1】:

DataBinder 有两个名为 allowedFieldsdisallowedFields 的属性,它们定义(禁止)绑定的内容。只需在您的 @InitBinder 方法中使用它:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.setDisallowedFields("administrator");
}

【讨论】:

  • 有没有办法根据登录用户的角色允许某些字段。
  • 这是java代码,所以可以用编程逻辑if(acl.allowCapability())
  • 不错。这听起来更灵活,因此将其标记为答案。
【解决方案2】:

您可以使用“!myParam”样式表达式过滤请求,以指示指定的参数不应该出现在请求中。

@RequestMapping(params="!administrator")

【讨论】:

  • 不错。我认为这个或 initBinder 方法都可以。太糟糕了,我不能“回答”两次。
【解决方案3】:

不要把这个administrator参数发给客户端,在服务器端控制。

【讨论】:

  • 它本身不是一个参数,它是 User 对象的一个​​属性。我的问题是问是否有办法忽略这个属性。
  • 您的用户模型对象绑定在视图层上?有些人认为这很好。我想不是。然而,这是一个有争议的问题。见stackoverflow.com/questions/2680071/…。当您在域对象的对面使用 DTO 时,我的评论仍在继续。
  • 这个解决方案的问题是有人仍然可以恶意地将参数添加到表单并控制它的值。当然,您可以覆盖发送过来的任何内容,但很容易忘记覆盖属性,因此最好将允许的属性列入白名单。
猜你喜欢
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 2011-04-11
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多