SQL Injection 공격
SQL Injection 공격이란?
웹 애플리케이션에서 입력데이터에 대한 유효성 검증을 하지 않을 경우, 공격자가 입력 창 및 URL에 SQL 문을 삽입하여 DB로 부터 정보를 열람, 조작할 수 있는 취약점 공격기법
SQL 삽입 공격 시큐어 코딩 조치
안전하지 않은 코드의 예로 외부로부터 입력받은 카테고리의 값을 아무런 검증과정을 거치지 않고 SQL 쿼리를 생성하는데 사용하고 있다.
매개변수를 받는 PreparedStatement 객체를 상수 문자열로 생성하고 파라미터 부분을 setString 등의 메서드로 설정하여 외부의 입력이 쿼리문의 구조를 바꾸는 것을 정의한다.
구분 | 코드 및 설명 |
조치 전 | String category = request.getParameter("category"); ... String sql = "SELECT * FROM board WHERE b_category=" + category + ""; ----- ① Connection con = db.getConnection(); Statement stmt = con.createStatement(); ----- ② ResultSet rs = stmt.executeQuery(sql); ----- ② |
① 외부로부터 입력받은 값을 검증 없이 사용할 경우 안전하지 않음 ② 외부로부터 입력받은 값이 처리 없이 쿼리로 수행되어 안전하지 않음 |
|
조치 후 | String category = request.getParameter("category"); ... String sql = "SELECT * FROM board WHERE b_category= ?"; ----- ① Connection con = db.getConnection(); PreparedStatement pstmt = con.preparStatement(sql); ----- ② pstmt.setString(1, category); ResultSet rs = pstmt.executeQuery(); ------ ③ |
① 외부로부터 입력받은 값은 안전하지 않을 수 있어 PreparedStatement 사용을 위해 ? 문자로 바인딩 변수 사용 ② PreparedStatement를 사용 ③ PreparedStatement 객체를 상수 문자열로 생성하고 파라미터 부분을 setString 메서드로 설정하여 안전 |
'공부 > SQL' 카테고리의 다른 글
[SQL/오라클] ROLLUP, CUBE, GROUPING SETS (0) | 2020.11.27 |
---|---|
[SQL/오라클] DROP vs DELETE vs TRUNCATE 차이 (0) | 2020.11.18 |
[SQL/오라클] NULL 개념 (0) | 2020.11.18 |
[SQLD] 모델링의 이해(2) (0) | 2020.09.02 |
[SQLD] 모델링의 이해(1) (0) | 2020.08.26 |