2017-12-22 24 views
2

의 안전하지 않은 바인더 구성 (API 남용, 구조) 다음 두 가지 방법으로 의사를 찾는 컨트롤러 클래스가 있습니다 (컨텍스트가 변경됨). 얻기 대량 할당 : 두 방법 모두에서 안전하지 않은 바인더 구성 (API 남용, 구조적) 오류.대량 할당 문제를 해결하는 방법 : Java

@Controller 
@RequestMapping(value = "/findDocSearch") 
public class Controller { 

    @Autowired 
    private IFindDocService findDocService; 

    @RequestMapping(value = "/byName", method = RequestMethod.GET) 
    @ResponseBody 
    public List<FindDocDTO> findDocByName(FindDocBean bean) { 
     return findDocService.retrieveDocByName(bean.getName()); 
    } 

    @RequestMapping(value = "/byLoc", method = RequestMethod.GET) 
    @ResponseBody 
    public List<FindDocDTO> findDocByLocation(FindDocBean bean) { 
     return findDocService.retrieveDocByZipCode(bean.getZipcode(), 
     bean.getDistance()); 
    } 
} 

내 콩은 다음과 같습니다

public class FindDocBean implements Serializable { 
    private static final long serialVersionUID = -1212xxxL; 

    private String name; 
    private String zipcode; 
    private int distance; 

    @Override 
    public String toString() { 
     return String.format("FindDocBean[name: %s, zipcode:%s, distance:%s]", 
       name, zipcode, distance); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getZipcode() { 
     return zipcode; 
    } 

    public void setZipcode(String zipcode) { 
     this.zipcode = zipcode; 
    } 

    public int getDistance() { 
     return distance; 
    } 

    public void setDistance(int distance) { 
     this.distance = distance; 
    } 

으로 지금까지 발견 된 모든 제안에 따라, 그들은 다음과 같은 경우에만 뭔가에 필요한 매개 변수를 사용하여 빈을 제한하기 위해 제안된다 :

final String[] DISALLOWED_FIELDS = new String[]{"bean.name", "bean.zipcode", }; 

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.setDisallowedFields(DISALLOWED_FIELDS); 

하지만 내 문제는 모든 콩의 3 매개 변수는 컨트롤러에서 제공되는 방법 중 하나에서 사용됩니다.

누군가가이 문제에 대한 해결책을 제안 할 수 있습니까? 미리 감사드립니다.

+0

왜 콩을 사용하나요? 어쨌든 문자열 만 사용하므로 모든 메서드에서 String에 바인딩 할 수 있습니다. findByDocName (문자열 이름) – koe

답변

1

메소드에는 InitBinder를 사용할 수 있습니다. 너는 이것을 시도 할 수있다.내가 같은 문제에 직면했다

@InitBinder("findDocByName") 
public void initBinderByName(WebDataBinder binder) { 
    binder.setDisallowedFields(new String[]{"distance","zipcode"}); 
} 


@InitBinder("findDocByLocation") 
public void initBinderByZipCode(WebDataBinder binder) { 
    binder.setDisallowedFields(new String[]{"distance","name"}); 
} 
0

간단한 질문 - 매퍼가 콩을 생성하는 방법은 무엇입니까? Here은 답/예입니다. 해당 데이터를 query parameter 또는 header으로 전달할 수 있습니다. 그러나 그것은 이상 할 것이다. 위치 또는 이름을 제공하는 @QueryParam으로 해당 메소드를 갖는 것이 더 좋습니다. 그렇게하면 응용 프로그램을 보호하기가 더 쉬워집니다.

부수적으로 쿼리의 길이는 제한되어 있으므로 검색 양식이 크고 이상한 경우 @POST을 사용하면 모든 데이터를 전달할 수 있습니다. 이것을 위해, 과잉 살이 간단한 예제.

0

이것은 불행한 거짓 긍정처럼 보입니다. 이 오류 뒤에있는 규칙은 객체에있는 속성이 유효성이 확인되지 않은 사용자 입력이 의도하지 않은 것임을 피하기 위해 만들어졌습니다. 실수로 웹 요청으로 채워진입니다. 예를 들어 자원을 작성하는 POST 요청이 있습니다. 요청 처리기가 전체 리소스 객체를 사용하여 누락 된 속성 만 채우는 경우 악의적 인 사용자가 편집 할 수없는 필드를 채울 수 있습니다.

그러나이 경우는 체계와 일치하지 않습니다. 당신은 다른 메커니즘을 포착하기 위해 동일한 메커니즘을 사용합니다. 또한 채워진 속성은 읽지 않습니다.

GET http://yourhost/findDocSearch/byName?name=Abuse&zipCode=11111

에서 추가 우편 번호는 단지 무시 될 것이다. 따라서 가정 된 위험은 여기에 존재하지 않습니다.

으로 수정 경고를 표시하면 거짓 긍정으로 표시 될 수 있습니다 (설정 내에서 가능할 경우). 이것이 가능하지 않은 경우 쿼리 매개 변수를 메서드 인수에 직접 매핑 할 수도 있습니다. 너무 많은 피해를주지 않아야하는 제한된 매개 변수 만 있기 때문입니다. 이것도 옵션이 아니면 코드 분석이 인식 할 수있는 검사를 파악하기 위해 정확한 알고리즘을 찾아야 할 것입니다. 불행히도 대부분의 스캐너는 입력 유효성 검사를 수행하는 데 제한된 방법만을 사용할 수 있습니다.

0

, 그럼 내가 같은 나머지 컨트롤러 클래스에서 코드 아래에 추가 :

@InitBinder 
public void populateCustomerRequest(WebDataBinder binder) { 
    binder.setDisallowedFields(new String[]{}); 
} 

을 지금은 고정 된 저와 대량 할당 문제에 대한 제대로 작동합니다.