JAVA/JSP SQL Injection 해킹 방지를 위한 코딩
Java 2011. 11. 16. 00:32
SQL Injection 은 사용자가 요상한 문자열을 입력해서 쿼리를 요상하게 바꿔 버려서 아무 아이디로나 로그인이 훅 되버린다던지 하는 쪼금은 싱거운 해킹방법중의 하나라고 나는 알고 있다.
뭐 예를들어 아이디 비번을 입력하고 로그인 할때
아이디로 admin' OR '1'='1 요런걸 입력하고 로그인을 했을때 admin 으로 싹 로그인 되 버리는 어처구니 없는 일이 발생하는 것이 SQL Injection 처리를 쪽바로 해주지 않았을때 일어나는 참혹한 일이다.
SQL Injection 이 발생하는 전형적인 코드는 다음과 같다.
String userid=request.getParameter("userid"); String password=request.getParameter("password"); .... .... Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select count(*) as cnt from member where userid='"+userid+"' and password='"+password+"'"); .... ....
위 코드처럼 사용자 정보를 받아서 쿼리를 실행하고 실행결과가 1 이면 로그인 시켜주는 코드가 있다.
그런데 사용자가 아디디로 admin' OR '1'='1 을 입력하고 비밀번호로 abcd 를 입력한 후 로그인 시켜주셈~ 이라고 하면 우째될까?
위 코드대로라면 select count(*) from member where userid='amdin' OR '1'='1' and password = 'abcd' 이 쿼리가 실행되 버린다 -_-;;;
무섭다. 만약 사용자 테이블에 userid 가 admin 이라는 레코드가 있다면 admin 으로 로그인 되버리는 것이다.
이런 어처구니 없는일이 놀랍게도 몇몇 허접한 사이트에서는 더러 통하는데도 있다 . -_-
아무튼 헛소리는 고만하고 본론으로 들어가서 SQL Injection 을 방지하려면 우째해야 될까?
Statement 대신 PreparedStatement 를 쓰면 된다. 요렇게.
.... .... PreparedStatement stmt = conn.prepareStatement("select count(*) from member where userid=? and password=?"); stmt.setString(1, userid); stmt.setString(2, password); ResultSet rs = stmt.executeQuery(); .... ....
PreparedStatement 만 쓰면 해결된다고 해서 또 요렇게는 쓰지 말길 -.-;
PreparedStatement stmt = conn.prepareStatement("select count(*) from member where userid='" + userid + "'" and password='" + password + "'");
※ 하이버네이트는 한번도 안써봐서 잘 모르겠는데 mybatis 나 ibatis 같은 경우는 무난하게 #{xxxx} 요런것만 썼다면 SQL Injection 이 방지된다.
그런데 WHERE 절에 ${xxxx} 이렇게 있다면 다시 한번 생각해 보기 바란다.
${xxxx} 이거는 문자열 더하는것과 똑같기 때문에 위험하다. ${xxxx} 요런건 ORDER BY 절 같은데만 사용하자.
2011/10/26 - [maven] - maven 으로 executable jar 맨들기(maven-jar-plugin, maven-dependency-plugin 이용)
2011/10/25 - [mybatis] - mybatis Oracle Procedure 호출하기
2011/10/12 - [mybatis] - mybatis 쿼리, 쿼리결과 로깅을 위한 log4j.xml 설정
2011/10/10 - [Java] - Runtime 에 jar 파일 클래스패스에 추가 시키기 : RuntimeJarLoader
2011/08/22 - [Java] - mybatis 에서 Oracle LONG, CLOB Select 시 에러날때 : getCLOB not implemented for class oracle.jdbc.driver.XXX
2011/08/19 - [Java] - Java JSON 처리 라이브러리 Jackson JSON Processor #2 : Map, List <--> JSON String 상호변환
2011/10/25 - [mybatis] - mybatis Oracle Procedure 호출하기
2011/10/12 - [mybatis] - mybatis 쿼리, 쿼리결과 로깅을 위한 log4j.xml 설정
2011/10/10 - [Java] - Runtime 에 jar 파일 클래스패스에 추가 시키기 : RuntimeJarLoader
2011/08/22 - [Java] - mybatis 에서 Oracle LONG, CLOB Select 시 에러날때 : getCLOB not implemented for class oracle.jdbc.driver.XXX
2011/08/19 - [Java] - Java JSON 처리 라이브러리 Jackson JSON Processor #2 : Map, List <--> JSON String 상호변환
'Java' 카테고리의 다른 글
xpath 를 이용, java 에서 xml 문서 쉽게 파싱하기 (5) | 2011.11.23 |
---|---|
재귀함수(Recursive funtion)을 이용한 특정 폴더 아래의 모든 파일정보 읽어서 출력하기 (0) | 2011.11.16 |
Java Map 반복(Iteration)시키는 3가지 방법 (5) | 2011.11.13 |
디폴트 패키지에 있는 자바 class 실행하기 ( Could not find the main class 에러날때 ) (1) | 2011.11.09 |
WAS(Tomcat 또는 기타등등~) 메모리 사용현황 모니터링 JSP (3) | 2011.10.18 |