SQL Injection 과 같은 보안 취약점을 해결하기 위해서 사용자 화면에서 특정문자열이 아닌 문자열이 넘어올 때 서버단에서 체크해서 막는 작업을 하고자 한다.
예를 들어 화면에서 위와 같은 select box가 있을 경우 검색버튼을 누르면 select box의 선택값과 입력한 검색어를 가지고 서버단으로 가게된다.
select box의 name이 condition이고 검색어의 name이 keyword라면
condition = 선택한 select 값
keyword = 입력한 값
이 된다.
쿼리가
${condition} = #{keyword})
이렇게 성립될 수 있다.
선택한 컬럼에서 입력한 키워드와 같은 레코드를 출력한다.
그럼 ${condition} 에서 .SQL Injection 취약점에 노출되게 된다.
내가 노출하려 하지 않았던 컬럼까지 접근이 가능하게 된다.
예를들어 내가 스크립트에서 게시판 id의 value값을 다른 컬럼명으로 바꿔서 검색을 했을 경우
원치 않았던 데이터가 노출될 수 있다.
따라서 아래와 같은 조치를 취했다
List<String> conditionList =Arrays.asList("bbs_id","bbs_nm");
if(Collections.disjoint(Collections.singletonList(vo.getCondition()), conditionList)){
vo.setKeyword(null);
vo.setCondition(null);
}
condition 의 값이 bbs_id(게시판 id) , bbs_nm(게시판 명) 이 아니면
Keyword와 Condition을 초기화 하는 것이다 .
Collections.disjoint
두 개의 컬렉션을 비교해서 일치하는 값이 하나도 없으면 true, 하나라도 있으면 false 반환
비교하기 위해서 condition 의 값도 리스트로 만들어줬는데 값이 배열로 여러개가 넘어오는게 아니고 한개만 오기 때문에 메모리 절약을 위해서 요소가 없거나(empty) 하나인 경우에는 Collections.emptyList() 또는 Collections.singletonList()를 사용하는게 좋다
Arrays.asList()는 배열의 요소가 한 개여도 Collections.singletonList()보다 사이즈가 크다
Arrays.asList()를 사용하는 경우는 리스트 요소의 속성이 변경되어야 할때
크기가 기본 배열 사이즈로 초기화되어있다. 즉, 사이즈를 1로 만들기 위해 가변인자를 받음 -> 가변인자를 배열로 변경 → 1의 크기를 가지는 리스트 생성 의 과정을 거침.
Collections.singletonList()를 사용하는 경우
리스트 요소의 주솟값 뿐만 아니라 속성 또한 불변이어야 함을 보장해야 할 때
Arrays.asList()와 달리 항상 크기가 1, 1개의 인자를 받음 → 1의 크기를 가지는 리스트 생성