Как исправить OverPosting в Spring Boot Rest Api с параметром @RequestBody Json запрос? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть драйвер, который не настроен для ограничения того, какие атрибуты запроса могут быть сопоставлены с моделью, поэтому этот метод можно использовать для выполнения атак OverPosting или UnderPosting.

Я не хочу что в критически важное приложение я помещаю параметры, которые не хочу хранить или изменять в BD.

В проектах без REST я видел, что они решаются с помощью метода @InitBinder и настраиваются с помощью "setDisallowedFields", " setAllowedFields "и" setRequiredFields ", но при использовании параметра json @RequestBody, который сопоставлен с DTO, я не могу сделать ограничение, плюс у меня есть несколько контроллеров, которые получают разные атрибуты из одного и того же DTO

DTO

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

Контроллер

    @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);
     }

Запрос от почтальона :
Request from Postman

Я надеюсь, что у меня будет проверка типа связующего, которая отключит меня от полей DTO, которые не должны использоваться в запросе, принимая во внимание учтите, что в одном классе у меня может быть несколько контроллеров, использующих один и тот же DTO

1 Ответ

1 голос
/ 26 апреля 2020

Я плохо для Engli sh, поэтому GoogleTranslate.

Что-то в поисках Google, я нашел опцию https://www.baeldung.com/javax-validation-groups, группы проверки javax, Это работает, когда мы необходимо применить ограничения к определенному набору полей компонента, а затем мы хотим применить ограничения к другому набору полей того же компонента.

все ограничения проверки javax имеют атрибут groups, в этом имя группы, к которой относится ограничение, можно указать, указав имя интерфейса группы.

  1. создать интерфейсы: эти интерфейсы будут именами групп ограничения (InformacionBasica, InformacionAvanzada).
  2. , затем используйте интерфейсы на компоненте.


    @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;

и, например, из пружинной загрузки service:



    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);
                }

            }
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...