영속 개체들(Persist Entities)은 "@RequestMapping" 메소드의 인수로 사용해서는 안됩니다.

 

스프링 MVC 는 자동으로 “@RequestMapping” 으로 어노테이션이 달린 메소드의 요청 파라미터들을 빈으로 바인딩합니다.
이러한 자동 바인딩 기능때문에, “@RequestMapping” 으로 어노테이션된 메소드의 인자들에 예상치못한 필드들을 주입하게 될 수 있습니다.
영속 개체들(“@Entity” 혹은 “@Document”)은 데이터베이스들과 연결되고, Hibernate, JPA 또는 Spring Data MongoDB 과 같은 영속 프레임워크를 통해 자동적으로 갱신됩니다.
이러한 두 가지 요소들이 결합되어 악의적인 공격이 가능합니다: 만약 영속 개체가 “@RequestMapping” 으로 어노테이션된 메소드의 인자로 사용된다면, 특별하게 조작된 사용자의 인풋이 데이터베이스의 예상하지 못한 필드를 업데이트 하는 것이 가능합니다.
이러한 이유에서 “@Entity” 혹은 “@Document” 객체들은 “@RequestMapping” 으로 어노테이션된 메소드의 인자로 사용되는 것을 피해야 합니다. 이 룰은 “@RequestMapping” 외에도 Spring Framework 4.3에 도입된 “@GetMapping”, “@PostMapping”, “@PutMapping”, “@DeleteMapping”, “@PatchMapping”도 고려합니다.

규칙을 어긴 코드

import javax.persistence.Entity;

@Entity
public class Wish {
    Long productId;
    Long quantity;
    Client client;
}

@Entity
public class Client {
    String clientId;
    String name;
    String password;
}

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class WishListController {

    @PostMapping(path = "/saveForLater")
    public String saveForLater(Wish wish) {
        session.save(wish);
    }

    @RequestMapping(path = "/saveForLater", method = RequestMethod.POST)
    public String saveForLater(Wish wish) {
        session.save(wish);
    }
}

규칙을 준수한 해결책

public class WishDTO {
    Long productId;
    Long quantity;
    Long clientId;
}

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class PurchaseOrderController {

    @PostMapping(path = "/saveForLater")
    public String saveForLater(WishDTO wish) {
        Wish persistentWish = new Wish();
        // "wish" 와 "persistentWish" 을 매핑합니다.
        [...]
        session.save(persistentWish);
    }

    @RequestMapping(path = "/saveForLater", method = RequestMethod.POST)
    public String saveForLater(WishDTO wish) {
        Wish persistentWish = new Wish();
        // "wish" 와 "persistentWish" 을 매핑합니다.
        [...]
        session.save(persistentWish);
    }
}

예외

스프링 프레임워크의 “@PathVariable” 를 통해 매개 변수에 주석을 달 때는 문제가 보고되지 않았습니다. ID를 통해 조회가 수행되므로 클라이언트 측에서 개체를 위조할 수 없습니다.

참고


If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project