회원 검색 기능을 이렇게 짰는데 보안상 위험하다고 리뷰에서 지적받았어요.
String query = "SELECT * FROM users WHERE name = '" + input + "'";
input에 사용자가 입력한 값이 그대로 들어갑니다. 근데 만약 누가 이런 값을 넣으면,
' OR '1'='1
쿼리가 이렇게 완성돼서 조건이 항상 참이 되고 전체 유저가 다 노출되더라고요.
SELECT * FROM users WHERE name = '' OR '1'='1'
일단 따옴표를 이스케이프 처리하는 걸로 급하게 막긴 했는데, 선배가 "그건 임시방편이고 파라미터 바인딩 써라"라고 하시더라고요.
String query = "SELECT * FROM users WHERE name = ?";
이렇게 물음표로 두고 값을 따로 바인딩하는 방식 말하는 거 같은데, 왜 이스케이프보다 이게 근본적인 해결책인 건가요? 원리가 궁금합니다.