카테고리 없음

대괄호와 같은 일부 문자가 Spring REST 엔드 포인트에서 400 BAD REQUEST 오류를 일으키는 이유는 무엇입니까?

기록만이살길 2021. 2. 22. 06:12
반응형

대괄호와 같은 일부 문자가 Spring REST 엔드 포인트에서 400 BAD REQUEST 오류를 일으키는 이유는 무엇입니까?

1. 질문(문제점):

Spring 애플리케이션에서 GET 메서드를 통해 노출 된 REST API를 호출하려고합니다. 요청을 보낼 때 컨트롤러가 일부 문자를 지원하지 않고 컨트롤러 코드가 실행되기 전에 즉시 400 BAD_REQUEST 오류를 반환합니다.

버그를 재현하는 캐릭터 :

[]{}|\

다음과 같은 다른 모든 특성은 버그를 재현하지 않습니다.

&+<>$?!@°*~#"'/

작업 요청의 예 :

http://localhost:8888/api?a=&b=Hello&c=&d=&e=0&f=1

작동하지 않는 요청의 예 :

http://localhost:8888/api?a=&b=%5BHello&c=&d=&e=0&f=1

문자열에서 문자의 위치는이 버그에 영향을주지 않습니다. 이 버그는 위에서 언급 한 6 개의 문자 중 하나가 문자열 매개 변수에있을 때 발생합니다.

다음은 컨트롤러 코드입니다.

@GetMapping
public ResponseEntity<Object> getEmails(
        @RequestParam(required = false, name = "a") String a,
        @RequestParam(required = false, name = "b") String b,
        @RequestParam(required = false, name = "c") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime c,
        @RequestParam(required = false, name = "d") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime d,
        @RequestParam(name = "e") Integer e,
        @RequestParam(name = "f") Integer f
) {
    return new ResponseEntity<>(myService.doSomeStuff(a, b, c, d, e, f), HttpStatus.OK);
}

다음과 같은 Jackson 종속성과 함께 Spring을 사용합니다.

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.3</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.3</version>
    </dependency>

2. 해결방안:

클라이언트 측에서 URL을 인코딩해야합니다.

http://localhost:8083?a=asd[

당신은 이것으로 끝날 것입니다

http://localhost:8083?a=asd%5B

클라이언트는 일반적으로 URL 인코딩 기능을 제공하므로 설명서를 확인하십시오. 테스트를 위해 Postman과 같은 클라이언트를 사용하는 경우 주소 표시 줄을 마우스 오른쪽 버튼으로 클릭하면 URL을 인코딩 할 수있는 옵션이 있습니다.

다음과 같은 일부 문자 [는 허용되지만 안전하지 않은 문자로 간주되므로 인코딩이 필요합니다.

나중에 편집 :

귀하의 코드와 요청을 테스트했으며 모든 것이 잘 작동합니다. 내가 만든 유일한 변경 사항은 응답 엔터티 대신 문자열을 반환하는 컨트롤러 메서드였습니다.

@RestController
class Ctrl {
    @GetMapping
    public String getEmails(
            @RequestParam(required = false, name = "a") String a,
            @RequestParam(required = false, name = "b") String b,
            @RequestParam(required = false, name = "c") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime c,
            @RequestParam(required = false, name = "d") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime d,
            @RequestParam(name = "e") Integer e,
            @RequestParam(name = "f") Integer f
    ) {
        return "";
    }
}

curl --location --request GET 'http://localhost:8083?a=&b=%5BHello&c=&d=&e=0&f=1'

스프링 디버그 / 추적 로깅을 활성화하고 무슨 일이 일어나고 있는지 볼 수 있습니다.

65883124
반응형