티스토리 뷰

개발

[mybatis] sql injection 예방

달리는개발자 2012. 5. 21. 16:04

 

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

http://www.mybatis.org/

 

[iBatis] LIKE 검색 구문 사용하기

http://theeye.pe.kr/186

 

How To Fix SQL Injection : MyBatis

http://software-security.sans.org/developer-how-to/fix-sql-injection-in-java-mybatis

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함