티스토리 뷰
SQL injection 공격에 취약하지 않게 mybatis를 사용하자
안전한 사용
#{} 구문을 사용하면 기본적으로 아래와 같이 PreparedStatement 파라미터를 생성하고 그 값을 대입한다.
/* Comparable JDBC code */ String selectPerson = "SELECT * FROM PERSON WHERE ID = ?"; PreparedStatement ps = conn.prepareStatement(selectPerson); ps.setInt(1, id);
몇 가지 예제를 더 보자 ^^
/* ORACLE */ /* MS-SQL */insert into Person (id, name, email, phone) values (#{id}, #{name}, #{email}, #{phone}) update Person set name = #{name}, email = #{email}, phone = #{phone} where id = #{id} delete from Person where id = #{id}
취약한 사용
${} 구문은 값을 직접 주입한다.
값을 검증하지 않거나 적절하게 처리하지 않아 phone 변수에 "1%' OR '1'='1'" 값을 입력해서 다음과 같은 쿼리문이 작성된다면 PERSON 테이블의 모든 데이터가 반환될 것이다.
반면에 phone 변수에 "A%'; DELETE FROM PERSON; --"를 입력한다면 PERSON 테이블의 모든 데이터가 지워질 것이다.
${} 구문을 사용할 때는 적절한 검증을 통해서 값이 알맞게 들어가도록 해야한다.
가급적 쓰지 않는 것이 최선일 듯 하다
취약한 사용의 몇가지 예제를 더 보자~
insert into Person (id, name, email, phone) values (#{id}, #{name}, #{email}, ${phone}) update Person set phone = ${phone} where id = #{id} delete from Person where id = ${id}
mybatis
[iBatis] LIKE 검색 구문 사용하기
How To Fix SQL Injection : MyBatis
http://software-security.sans.org/developer-how-to/fix-sql-injection-in-java-mybatis
반응형