본문 바로가기

개발 관련 부가 지식/기타

시큐어코딩 - Parameter Binding

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을 방어할 수 있게 된다.

 

👏