✏️ Java 코드 에디터
취약한 코드
import java.sql.*;
public class UserDao {
public void getUser(Connection conn, String userId) throws SQLException {
Statement stmt = null;
ResultSet rs = null;
try {
// [취약점] 외부 입력값(userId)이 쿼리 문자열에 그대로 연결됨
// 공격자가 ' OR '1'='1 입력을 주면 모든 사용자 정보가 유출됨
String query = "SELECT * FROM users WHERE id = '" + userId + "'";
stmt = conn.createStatement();
rs = stmt.executeQuery(query);
while(rs.next()) {
System.out.println("User: " + rs.getString("username"));
}
} finally {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
}
}
}
💡 수정 가이드
1. 쿼리 문자열 수정
입력값을 연결하는 대신 물음표(?)를 사용하세요.
String query = "SELECT * FROM users WHERE id = ?";
2. PreparedStatement 객체 사용
createStatement() 대신 prepareStatement(query)를 사용합니다.
PreparedStatement pstmt = conn.prepareStatement(query);
3. 값 바인딩
물음표 위치에 실제 값을 할당합니다.
pstmt.setString(1, userId);
📊 분석 결과 및 설명
🎯 목표
현재 코드는 문자열 결합을 통해 SQL 쿼리를 동적으로 생성하고 있습니다. 이는 SQL Injection 공격에 매우 취약합니다. PreparedStatement와 ? 바인딩 변수를 사용하여 쿼리의 구조와 데이터를 분리하세요.
⚠️ 현재 취약점
Dynamic SQL Generation
입력값 userId가 검증 없이 쿼리에 포함됩니다. 만약 입력값이 admin' --라면, 비밀번호 검증 없이 관리자 계정으로 로그인이 가능해집니다.