simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • controllerTest
  • 참조변수
  • scanner #next() #nextLine()
  • 컨트롤러
  • 404
  • null
  • 참조타입
  • JVM메모리구조
  • 자바프로그램
  • 자바프로그래밍
  • 자바
  • 스프링
  • 자바메모리구조

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

Language/SQL

[DATABASE] PreparedStatement를 사용하여 시큐어코딩하기

2022. 4. 21. 18:05

■ SQL Injection

공격자가 악의적인 의도를 갖는 SQL 구문을 삽입하여, 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법

 

▶ 해커의 해킹 방식

//아래의 SQL문에 항상 참인 값을 넣으면 모든 정보가 노출이된다.
String sql = "SELECT * FROM test_member WHERE id = 'test' AND pwd = '1234'" + "or 1 = 1";

- 위와 같은 방식으로 SQL구문을 삽입하여 DB를 조작하는 공격을 SQL 인젝션이라 한다.

- 해결 방법 : PreparedStatement를 사용한다.

 

■ Statement와 PreparedStatment의 차이점

  Statement PreparedStatement
차이점 캐시 미사용 캐시 사용
절차 쿼리 문장 분석
컴파일
실행
--> 계속해서 위 세단계를 반복
쿼리 문장 분석
컴파일
실행
-> 처음 한번만, 캐시에 담아 재사용
결론 보안 낮음, 성능 낮음 보안 높음, 성능 높음

 

■ PreparedStatement로 JDBC프로그래밍 하는 순서

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class _00_preparedStatement {

	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 정보를 찾을 수 없습니다.");
		}
	}
	
	public static void main(String[] args) throws Exception{
		//1. 연결
		String url = "  /* url 정보 */";
		String user = "계정명";
		String pwd = "비밀번호";
		
		Connection conn = DriverManager.getConnection(url, user, pwd);
		
		//2. preparedStatement
		//1) SQL문에 '?'를 넣어 값을 넣을 parameter를 형성
		// parameter index   1        2
		//                   id = ?   pwd = ?  
		String sql = "SELECT * FROM test_member WHERE id = ? AND pwd = ?";
		
		//2) PreparedStatement안에 SQL문을 넣기
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		//3) SQL문의 parameter를 세팅한다.
		pstmt.setString(1, "사용자 아이디");
		pstmt.setString(2, "사용자 비밀번호");
		
		//3. 처리
		ResultSet rs = pstmt.executeQuery();
		
		while (rs.next()) {
			String name = rs.getString("name");
			String id = rs.getString("id");
			String password = rs.getString("pwd");
			
			System.out.printf("[%s]님의 아이디는 %s, 비밀번호는 %s\n",name,id,password);
		}
		
		//4. 닫기
		rs.close();
		pstmt.close();
		conn.close();
		
	}//end main

}

 

 

 

- 출처:

  - SQL인젝션 개념 https://dev-coco.tistory.com/158 [슬기로운 개발생활😃]

  - 캐시에 대한 자세한 내용 https://p829911.tistory.com/11

  - 그 외 ) 국비지원 수업 과정

- 참고 : 여기어때의 해킹 사건 https://show-me-the-money.tistory.com/entry/%EC%97%AC%EA%B8%B0-%EC%96%B4%EB%95%8C-%ED%95%B4%ED%82%B9-%EC%82%AC%EA%B1%B4%EC%9D%84-%ED%8C%8C%ED%97%A4%EC%B9%98%EB%8B%A4

'Language > SQL' 카테고리의 다른 글

[DATABASE] MVC 모델 구현 _ 성적 관리 프로그램  (0) 2022.04.25
[DATABASE] 자바를 통한 DB 모듈화  (0) 2022.04.23
[DATABASE] JAVA프로그램과 DB 연결하기  (0) 2022.04.21
[DATABASE] JOIN  (0) 2022.04.21
[DATABASE] SEQUENCE, INDEX  (0) 2022.04.21
    'Language/SQL' 카테고리의 다른 글
    • [DATABASE] MVC 모델 구현 _ 성적 관리 프로그램
    • [DATABASE] 자바를 통한 DB 모듈화
    • [DATABASE] JAVA프로그램과 DB 연결하기
    • [DATABASE] JOIN
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바