Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- jstl 종류
- 제약조건 제거
- 지속쿠키
- jstl dependency
- Stored Procedure log
- 내도메인 한국
- rsa java
- aws
- 하이브리드암호화
- aws lightsail
- springboot3 jstl
- RSA
- 플러터
- git
- 세션쿠키
- docker error
- rsa 복호화
- jenkins git ignore file 추가
- XSS 예방
- lightsail 도메인 연결
- 하이브리드 암호화
- swap file
- Docker
- Flutter
- 스왑 메모리
- AES
- fk컬럼 삭제
- aws lightsail 배포
- springboot 배포
- spring
Archives
- Today
- Total
easycode
SQL Injection 설명과 예방법(Mybatis&JPA) 본문
면접 준비를 하며 공부했던 CS 지식 중 SQL Injection에 대해 공부한 걸 간단하게 기록해보려 합니다. 제게 필요한 내용만 요약한 거라 좀더 자세한 내용과 이해를 원하신다면 아래에 있는 참고사이트를 봐 주세요! 누군가에게 이 글이 도움이 되기를 바랍니다.
SQL Injection이란?
공격자가 동적 쿼리를 생성하여 DB 정보를 열람하거나 마음대로 조작하는 것을 뜻합니다.
SQL Injection 방어 (Mybatis) : #{ } 사용하기!
파라미터를 넣을 때 #{ }를 사용하면 된다. #{ }이 내부적으로 PrepareStatement를 사용하기 때문에 쿼리와 입력값을 분리해 줘 SQL Injection 공격에 안전하다 (문자열 형태로 들어와서 파라미터 형태가 됩니다)
SQL Injection 방어 (JPA) : 기본 메서드에서 SQL Injection 방어 지원
기본적으로 대응되긴 하나, 입력값을 넣을 때 파라미터 바인딩을 사용하자!
JPA는 기본 메서드에서 PrepareStatement를 사용하여 SQL Injection을 방어한다. 기본적으로 제공하는 API 내에 Parameter Binding을 이용하고 있어 SQL Injection에 대응할 수 있다.
그러나 JPA query를 만들어서 사용할 때도 입력값을 바로 쿼리에 넣게되면 SQL injection에 취약하므로, 이때도 파라미터 바인딩을 사용해야 한다.
Prepare Statement를 이용한 SQL Injection 방어
- Prepare Statement는 DB 스펙이다. 즉, DB에서 미리 준비된 구문을 설정하고 실행 계획까지 다 세워 놓은 후, 여기에 파라미터만 입력받아 실행한다.
- 즉, String을 JAVA단에서 들고 있다가 단순히 치환하는 게 아닌 DB에 미리 실행계획을 생성해두고 파라미터 값만 받는다는 뜻입니다.
select * from user where login_id = {loginId}
- 위와 같은 쿼리문이 있다고 할 때, DB는 미리 실행 계획을 만들고 {loginId} 라는 파라미터만 기다리고 있다. 즉, DB는 들어 올 Input 값을 String형으로 기대하고 있는 것이다.
- Prepared Statement 는 DB 입장에서 미리 실행계획을 짜놓은 상태에서 대기하기 때문에 효율도 좋다.
동적쿼리의 SQL Injection
- 동적쿼리를 만들더라도 확정쿼리에 파라미터 바인딩을 추천한다. 변수를 대입받아 그대로 집어넣는 것은 각종 SQL Injection 대상이 되니 주의하자!
참고사이트
1. Spring 에서 SQL Injection 방어 그리고 원리 (feat. Prepared Statement, JPA, MyBatis) : https://developer-ping9.tistory.com/545
'CS' 카테고리의 다른 글
[자료구조] Map과 Map 컬렉션들(HashMap, HashTable, LinkedHashMap) (1) | 2024.02.27 |
---|---|
세션쿠키와 지속쿠키의 차이점 (feat.cookie secure) (0) | 2024.01.15 |
크로스 사이트 스크립팅 (XSS)의 의미와 예방법(feat.innerText vs textContent) (2) | 2024.01.15 |
[CS] RESTful API란? (feat. REST API 명세서 작성 가이드) (0) | 2023.09.12 |