최근 팀원과 프로젝트 진행 중 배포 후 구글폼과 함께 배포된 사이트를 피드백받고자 홍보를 했었다.
홍보 후 들어왔던 피드백중 하나였는데,
“검색창에 select를 치면 모든 게시글이 나와요.“
라는 피드백이였고, 너무 놀란 나머지 최대한 빨리 원인분석을 해보았다. 원인분석 이후 도달한 결론은 “문제없음” 이였다.
이유는 우리의 injection방어로직은 아래와 같은데,
/**
* SQL Injection 방어하기 위하여 구현
*/
private String changeNoSqlInjection(String query) {
query = SPECIAL_CHARS.matcher(query).replaceAll("");
for (String s : STRING_SET) {
if (query.contains(s)) {
return "";
}
}
return query;
}
해당 코드에서는 sql문인 select, update, insert, delete의 문자가 들어오면 무조건 빈 문자열을 리턴하기 때문에 “select”를 포함한 문자열을 검색했을 시 빈 문자열로 검색을 돌렸기에 위와 같은 상태가 되었던 것이었기에 문제가 없는 것이다.
하지만 이번 일로 인해 프로젝트를 진행하면서 중요하게 놓치고 있는 것을 다시한번 깨닫게 되었는데, 이유는 아래와 같다.
- 내가 팀원이 구현한 해당 sql Injection관련 코드를 봤었는데 그냥 그렇구나~ 하고 가볍게 넘긴 것
- 해당 기능이 구현된 후 직접 테스트해보지 않은 것
평소에 코드리뷰를 하려고 pull request 후에 리뷰, approve하는 형식인데 어느순간부터 아무 생각없이 approve만 하는 습관이 생기는 것 같다 물론 내가 바쁜 것도 바쁜 것이지만, 상대방의 코드를 통해 배울 점도, 부족한 점이 있다면 서로 피드백을 하면서 확인하는 것이 내가 성장하기에 가장 좋을텐데 간과하고 있었던 것이 이렇게 돌아올줄이야… 또, SQL injection이라면 기본적이면서도, 중요한 문제인데 이를 구현된 코드만 보고 가볍게 넘어가고 테스트해보지 않은 것이 문제가 있다고 생각했고, 더 신경써서 테스트를 해봐야 한다고 다시한번 느꼈다.
'LTF(learn through failure) > Spring' 카테고리의 다른 글
스프링부트 Lombok @RequiredArgsConstructor잘 알고쓰자 (0) | 2023.07.26 |
---|