일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 코테
- 데이터베이스
- 쿠버네티스
- Ai
- Linux
- 리눅스
- db
- docker
- 파이썬
- 자료구조
- 깃
- ubuntu
- 우분투
- Kubernetes
- programmers
- 코딩테스트
- mysql
- LV 0
- 알고리즘
- 정처기
- 머신러닝
- Java
- git
- 자바
- 인공지능
- github
- Lv 2
- 프로그래머스
- DevOps
- Python
Archives
- Today
- Total
Myo-Kyeong Tech Blog
[MySQL] SQL 삽입 공격 차단하기 - PreparedStatement 사용법 본문
728x90
반응형
SQL 삽입 공격 (SQL Injection Attack)
- 사용자가 값을 입력할 때 SQL 문법에 영향을 끼치는 문장을 삽입하여 공격하는 해킹 방법
SQL 삽입 공격(SQL Injection Attack)은 악의적인 사용자가 웹 어플리케이션의 보안 결함을 이용하여 임의의 SQL 명령을 실행하는 공격 방법입니다. 예를 들어, 사용자 입력을 제대로 검증하지 않고 그대로 SQL 쿼리에 포함시키면, 공격자는 해당 입력을 통해 예상치 못한 쿼리를 실행시킬 수 있습니다.
예를 들어, 비밀번호 확인 로직에서 다음과 같은 쿼리를 사용하면 SQL 삽입 공격에 취약해집니다.
String query = "SELECT * FROM Users WHERE name = '" + userName + "' AND password = '" + password + "'";
악의적인 사용자가 "'; DROP TABLE Users; --" 같은 입력을 사용하면, 원래의 쿼리는 다음과 같이 변합니다:
SELECT * FROM Users WHERE name = '' OR '1'='1'; DROP TABLE Users; --' AND password = ''
이 쿼리는 모든 사용자를 선택하고, Users 테이블을 삭제합니다. 여기서 '--'는 SQL 주석을 의미하므로 이후의 문자열은 무시됩니다.
PreparedStatement 사용법
- SQL 쿼리에 '?' 플레이스홀더를 넣기
- 각 플레이스홀더에 대해 setXxx() 메서드를 사용하여 값을 설정
- 여기서 'Xxx'는 해당 값의 타입. 예를 들어, 문자열에는 setString(), 정수에는 setInt()를 사용
PreparedStatement를 사용하는 예시입니다:
String query = "SELECT * FROM Users WHERE name = ? AND password = ?";
PreparedStatement pstmt = conn.prepareStatement(query);
pstmt.setString(1, userName);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
이 방식을 사용하면 SQL 쿼리 내의 사용자 입력이 적절히 이스케이프되므로 SQL 삽입 공격을 효과적으로 방지할 수 있습니다.
728x90
반응형
'데이터베이스' 카테고리의 다른 글
[MySQL] JAVA에서 JDBC 드라이버를 이용한 MySQL DBMS 연동하기 (0) | 2023.07.24 |
---|---|
[ MySQL ] 데이터베이스 키(Key) 종류 - 기본키, 대체키, 후보키, 인공키 (0) | 2023.07.19 |
[ MySQL ] SQL 문법 종류 - DDL, DML, DCL, TCL (0) | 2023.07.18 |
[ MySQL ] Gradle 빌드 파일에 MySQL JDBC Driver 추가하기 (0) | 2023.07.18 |
[ MySQL ] Windows 에 MySQL Community Server 8.0.33 로컬 설치 및 설정 (0) | 2023.07.17 |