考虑以下模型:
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。
Information securedField
Contact Form
据我所知,播放表单基于Spring DataBinder,因此可以处理集合字段吗?我不想这样写:
以下操作无效:
在这种情况下,我应该扩展现有Spring DataBinder和Form类并覆盖bind方法吗?
Spring DataBinder
Form
bind
这可能是一个更简单的解决方案。如何定义一个额外的约束,如果POST数据包含任何informations[%d].securedField值,该约束将触发验证失败?
informations[%d].securedField
import javax.validation.constraints.Null; public static class Information { @Null public String securedField; ... }
我认为,通过这种方法,您可以调用默认bindFromRequest方法,而不是接受表单字段名称白名单的方法,并且仍然可以防止大规模分配攻击。
bindFromRequest
公认的是,这种方法的一个缺点是,如果发生大规模的大规模分配攻击,它将最终泄漏您内部字段的名称。但是,如果他们的名字平淡无味,例如securedField(无意冒犯!)之类的毫无意义的名称,我不确定攻击者如何利用此信息。
securedField
如果要允许基于当前用户类型分配给该字段,那么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(); } ...