Myo-Kyeong Tech Blog

[MySQL] SQL 삽입 공격 차단하기 - PreparedStatement 사용법 본문

데이터베이스

[MySQL] SQL 삽입 공격 차단하기 - PreparedStatement 사용법

myo-kyeong 2023. 7. 24. 20:03
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
반응형