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.

传递的安全漏洞