java - 如何使用参数 @RequestBody Json 请求纠正 Spring Boot Rest Api 中的 OverPosting?

标签 java spring spring-boot rest

我的驱动程序未配置为限制允许将请求的哪些属性映射到模型,因此该方法可用于执行 OverPosting 或 UnderPosting 攻击。

我不希望在关键应用程序中放置我不想在 BD 中存储或修改的参数。

在没有 REST 的项目中,我看到他们用一种方法来解决 @InitBinder 并配置为 “setDisallowedFields”、“setAllowedFields”和“setRequiredFields”,但是当使用映射到 DTO 的 json @RequestBody 参数时,我无法进行限制,而且我有几个 Controller 从同一 DTO 接收不同的属性

DTO

    public class ImagenAyudaDTO implements Serializable {
         private static final long serialVersionUID = 1L;
         private Integer idImagenAyuda;
         private String urlImagen;
         private String estado;}

Controller

    @PostMapping(path = "/getdto")
        public ResponseEntity<ImagenAyudaDTO> getDto(
         @RequestBody(required = true) @Valid ImagenAyudaDTO i
            ) {
        Logger.info("getDto request " + i.toString());
        ImagenAyudaDTO im = new ImagenAyudaDTO();
        im.setEstado("D");
        im.setIdImagenAyuda(new Integer(2));
        im.setUrlImagen("https://start.spring.io/");
        Logger.info("getDto Response " + im.toString());
        return new ResponseEntity<ImagenAyudaDTO>(im, HttpStatus.OK);
    }

Binder

    @InitBinder
    public void filterGetdto(WebDataBinder dataBinder) {
        final String[] DISALLOWED_FIELDS = new String[] { "estado" };
        final String[] ALLOWED_FIELDS = new String[] { "idImagenAyuda", "urlImagen" };
        final String[] REQUIRED_FIELDS = new String[] { "idImagenAyuda", "urlImagen" };
        dataBinder.setDisallowedFields(DISALLOWED_FIELDS);
        dataBinder.setAllowedFields(ALLOWED_FIELDS);
        dataBinder.setRequiredFields(REQUIRED_FIELDS);
     }

postman 的请求:
Request from Postman

我希望有一个 Binder 类型验证,禁止我访问不应在请求中使用的 DTO 字段,考虑到在同一个类中我可以有多个使用相同 DTO 的 Controller

最佳答案

我英语不好,所以才使用 Google 翻译。

谷歌搜索,我找到了一个选项 https://www.baeldung.com/javax-validation-groups ,javax 验证组,它适用于当我们需要对 bean 的一组字段应用约束,然后我们想要对同一 bean 的另一组字段应用约束时。

所有javax验证约束都有一个groups属性,在这个属性中可以指定该限制所属的组的名称,指定组接口(interface)的名称。

  1. 创建接口(interface):这些接口(interface)将是限制组的名称(InformacionBasica、InformacionAvanzada)。
  2. 然后使用 bean 上的接口(interface)。


    @Email(groups = InformacionBasica.class)
    private String email;
    @NotBlank(groups = InformacionBasica.class)
    private String telefono;

    @NotBlank(groups = {InformacionBasica.class, InformacionAvanzada.class})
    private String captcha;

    @NotBlank(groups = InformacionAvanzada.class)
    private String direccion;

例如来自休息spring boot服务:



    import javax.validation.Valid;
    import org.springframework.validation.annotation.Validated;

    @Validated
    public class PersonaRest{
    @PostMapping("/algoBasica")
            @Validated(InformacionBasica.class)
            public ResponseEntity hacerAlgo(@Valid @RequestBody PersonaTO p) {
                try {
                    personaServicio.hacerAlgo();
                    return new ResponseEntity(Boolean.TRUE, HttpStatus.OK);
                } catch (EmptyResultDataAccessException e) {
                    return new ResponseEntity(
                            "Informacion basica necesaria",
                            HttpStatus.BAD_REQUEST);
                }

            }

    @PostMapping("/algoAvanzada")
            @Validated(InformacionAvanzada.class)
            public ResponseEntity hacerAlgo(@Valid @RequestBody PersonaTO p) {
                try {
                    personaServicio.hacerAlgo();
                    return new ResponseEntity(Boolean.TRUE, HttpStatus.OK);
                } catch (EmptyResultDataAccessException e) {
                    return new ResponseEntity(
                            "Informacion avanzada necesaria",
                            HttpStatus.BAD_REQUEST);
                }

            }
    }

关于java - 如何使用参数 @RequestBody Json 请求纠正 Spring Boot Rest Api 中的 OverPosting?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61444509/

相关文章:

java - 在 Java 企业应用程序中使用翻译 map 时,如何获得良好的编码风格和易于维护?

java - JSP和SPRING启动: Generate CSV file from JSON input?

java - 无法从 Spring Boot 服务中的 application.properties 加载值

spring boot ssl 客户端证书因 PKIX 路径构建失败错误而失败

spring - Let's Encrypt 独立授权程序失败

java - 单元测试默认方法调用接口(interface)中的抽象方法

java - 套接字代码创建新的作家?

java - SpringBoot @WebMvcTest, Autowiring RestTemplateBuilder

javascript - 如何用Java触发js事件?

java - 如何访问 View 中 URI 模板中的路径变量(Spring 3/SpringMVC)?