Spring MVC 和 Thymeleaf 防止实体 ID 泄漏
Spring MVC and Thymeleaf Prevent Entity Id Leak
我有 Demand
个实体。我可以毫无问题地更新我的实体,但我认为我的方法存在一些安全问题。
需求控制器
@RequestMapping(value = "/details/{id}", method = RequestMethod.POST)
public String updateDemand(@PathVariable("id") Long id, @Valid @ModelAttribute Demand demand, BindingResult result) {
if (result.hasErrors()) {
return "demandUpdateForm";
} else {
demand.setDemandId(id);
demandService.updateDemand(demand);
return "redirect:/demands";
}
}
serviceImpl
@Override
public Demand updateDemand(Demand demand) {
return demandRepository.save(demand);
}
形式
<form id="vendorForm" th:action="@{/demands/details/__${demand.demandId}__}" th:object="${demand}" method="post" >
如您所见,我从行动中得到 DemandId
。例如,我想更新第 5 个 ID 的 demand
并获取更新表单。然后我通过开发者工具更改了 demandId
并点击提交。如果我修改 id 例如 2nd 并形成更新我的 2nd id demand
而不是原始的第 5 个。我怎样才能防止这种情况。
我认为如果您为此操作创建非托管 bean 并将其作为表单支持 bean 传递会更好。
public class DemandBean {
private Long id;
private String name;
...
// more fields
}
控制器:
@RequestMapping(value = "/details/update", method = RequestMethod.POST)
public String updateDemand(@Valid @ModelAttribute("demandBean") DemandBean demandBean, BindingResult result) {
if (result.hasErrors()) {
return "demandUpdateForm";
} else {
demandService.updateDemand(demandBean.getId(), demandBean.getName, ...);
return "redirect:/demands";
}
}
服务方式:
@Override
public void updateDemand(Long id, String name, //etc) {
Demand d = id == null ? new Demand() : demandRepository.findOne(id);
d.setName(name);
// ...
// set other fields
return demandRepository.save(demand);
}
这种方法可以帮助您避免通过 id
.
传递的安全漏洞
我有 Demand
个实体。我可以毫无问题地更新我的实体,但我认为我的方法存在一些安全问题。
需求控制器
@RequestMapping(value = "/details/{id}", method = RequestMethod.POST)
public String updateDemand(@PathVariable("id") Long id, @Valid @ModelAttribute Demand demand, BindingResult result) {
if (result.hasErrors()) {
return "demandUpdateForm";
} else {
demand.setDemandId(id);
demandService.updateDemand(demand);
return "redirect:/demands";
}
}
serviceImpl
@Override
public Demand updateDemand(Demand demand) {
return demandRepository.save(demand);
}
形式
<form id="vendorForm" th:action="@{/demands/details/__${demand.demandId}__}" th:object="${demand}" method="post" >
如您所见,我从行动中得到 DemandId
。例如,我想更新第 5 个 ID 的 demand
并获取更新表单。然后我通过开发者工具更改了 demandId
并点击提交。如果我修改 id 例如 2nd 并形成更新我的 2nd id demand
而不是原始的第 5 个。我怎样才能防止这种情况。
我认为如果您为此操作创建非托管 bean 并将其作为表单支持 bean 传递会更好。
public class DemandBean {
private Long id;
private String name;
...
// more fields
}
控制器:
@RequestMapping(value = "/details/update", method = RequestMethod.POST)
public String updateDemand(@Valid @ModelAttribute("demandBean") DemandBean demandBean, BindingResult result) {
if (result.hasErrors()) {
return "demandUpdateForm";
} else {
demandService.updateDemand(demandBean.getId(), demandBean.getName, ...);
return "redirect:/demands";
}
}
服务方式:
@Override
public void updateDemand(Long id, String name, //etc) {
Demand d = id == null ? new Demand() : demandRepository.findOne(id);
d.setName(name);
// ...
// set other fields
return demandRepository.save(demand);
}
这种方法可以帮助您避免通过 id
.