考虑以下模型:
public class Contact {
@Required
public String name;
@Valid
public List<Information> informations;
}
public static class Information {
public String securedField;
@Required
public String email;
@Valid
public List<Phone> phones;
public static class Phone {
@Required
@Pattern(value = "[0-9.+]+", message = "A valid phone number is required")
public String number;
}
}
}
我不想要Information securedField
受到影响批量分配漏洞。所以我决定设置 allowedFields 数组Contact Form
.
我所知,播放表单基于Spring DataBinder,那么是否可以处理集合字段?我不想写这样的东西:
- name
- 信息[0].电子邮件
- 信息[0].电话*
- 信息[1].电子邮件
- 信息[1].电话*
- etc
以下不起作用:
我应该延长现有的Spring DataBinder
and Form
类和覆盖bind
这种情况下的方法?
这是一个可以说更简单的解决方案。如何定义一个额外的约束,如果 POST 数据包含任何内容,该约束将触发验证失败informations[%d].securedField
values?
import javax.validation.constraints.Null;
public static class Information {
@Null
public String securedField;
...
}
我认为这样你可以调用默认值bindFromRequest
方法而不是接受表单字段名称白名单的方法,并且仍然可以免受大规模分配攻击。
不可否认,这种方法的一个缺点是,如果发生协同的大规模分配攻击,它最终会泄露内部字段的名称。然而,如果它们的名字相当平淡、毫无意义,比如securedField
(无意冒犯!),我不确定攻击者如何利用这些信息。
Edit
如果您想允许根据当前用户类型分配字段,也许 Bean 验证组可以提供帮助:
import javax.validation.constraints.Null;
public class Contact {
public interface Administrator {}
public interface User {}
...
public class Information {
@Null(groups = User.class)
public String securedField;
...
}
}
控制器代码
...
final Form<Contact> contactForm;
if (currentUser.isAdministrator()) {
contactForm = form(Contact.class, Administrator.class).bindFromRequest();
} else {
contactForm = form(Contact.class, User.class).bindFromRequest();
}
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)