【发布时间】:2011-06-28 17:04:33
【问题描述】:
我正在处理允许用户编辑个人资料信息的页面。我希望他们能够编辑他们的公共信息,但不允许他们更改系统标志,例如他们的用户类型。
这是使用 Spring MVC (3.0) 实现的。 User 对象具有典型的字段,例如 firstName、lastName、email(都应该是可编辑的)和一个布尔值 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
}
我的表单包含firstName、lastName 等字段,似乎工作正常。
问题在于,如果恶意用户发布带有参数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