개발 관련 부가 지식/기타
시큐어코딩 - Parameter Binding
Developer-Choi
2023. 3. 28. 19:00
728x90
728x90
웹에서 SQL Injection을 방어하기 위해 가장 많이 알고 쓰이는 Parameter Binding 에 대해서 알아보자 ✔
// 취약한 코드
private final EntityManager em;
public List<Member> findByName(String name) {
String query = "select m from Member m where m.name = '" + name + "'";
return em.createQuery(query, Member.class).getResultList();
}
위 취약한 코드 name에
"admin' OR '1'='1" 가 들어가게 되면
String query = select m from Member m where m.name = 'admin' OR '1'='1'
해당 쿼리가 완성이 되는데 OR 연산자로 인해 모든 member의 정보가 조회가 되버린다.
그럼 안전한 Parameter Binding 코드를 보자 ✔
// 안전한 Parameter Binding 코드
private final EntityManager em;
public List<Member> findByName(String name) {
return em.createQuery("select m from Member m where m.name =:name", Member.class)
.setParameter("name", name)
.getResultList();
}
위 코드 name에
"admin' OR '1'='1" 가 들어가게 되면 어떻게 될까?
-> 위 코드에서는 setParameter 메소드로 바인딩 시에 ' (싱글쿼터)가 이스케이프 처리가 되므로 문자열로 써 입력되기 때문에 SQL Injection을 방어할 수 있게 된다.
👏