관리 메뉴

ARTIFEX ;)

SQL injection Prepared Statement 2 본문

# Security/WEB, APP Vulnerabilities

SQL injection Prepared Statement 2

Artifex_Ethan_ 2024. 4. 5. 01:21
반응형
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Main {
    // JDBC 드라이버 및 데이터베이스 URL
    static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost/mydatabase";

    // 데이터베이스 자격 증명
    static final String USER = "username";
    static final String PASS = "password";

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            // JDBC 드라이버 등록
            Class.forName(JDBC_DRIVER);

            // 데이터베이스 연결
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // PreparedStatement를 사용하여 SQL 쿼리 작성
            String sql = "SELECT * FROM users WHERE username = ?";
            pstmt = conn.prepareStatement(sql);

            // 매개변수 설정
            pstmt.setString(1, "user123");

            // 쿼리 실행 및 결과 검색
            rs = pstmt.executeQuery();

            // 결과 처리
            while (rs.next()) {
                // 결과 출력
                System.out.println("ID: " + rs.getInt("id"));
                System.out.println("Username: " + rs.getString("username"));
                System.out.println("Email: " + rs.getString("email"));
            }
        } catch (SQLException se) {
            se.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 리소스 해제
            try {
                if (rs != null) rs.close();
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
        }
    }
}

예제 코드.

위의 코드는 데이터베이스에서 사용자를 검색하는 예제이다.
Prepared Statement를 사용하여 사용자 이름에 해당하는 사용자를 검색한다.

여기에 대한 간략한 설명은 다음과 같다.

  1. 코드 시작 부분에서는 JDBC 드라이버를 등록하고, 데이터베이스에 연결하기 위한 필수 정보를 제공한다.
  2. main() 메서드에서는 데이터베이스 연결을 시도한다.
  3. conn.prepareStatement(sql) 메서드를 사용하여 Prepared Statement를 생성한다. 이때 SQL 쿼리에 매개변수를 삽입한다.
  4. **pstmt.setString(1, "user123")**와 같이 setString() 메서드를 사용하여 매개변수를 설정한다.
       이 예제에서는 사용자 이름을 매개변수로 설정했다.
  5. **pstmt.executeQuery()**를 호출하여 쿼리를 실행하고, 그 결과를 **ResultSet**에 저장.
  6. while (rs.next()) 루프를 사용하여 **ResultSet**에서 결과를 하나씩 가져와 출력.

Prepared Statement의 적용 방안은 다음과 같다:

  • 사용자 입력을 SQL 쿼리에 직접 연결하는 대신, Prepared Statement를 사용하여 매개변수를 이용하여 쿼리를 작성한다. 이를 통해 SQL injection 공격을 방지할 수 있다.
  • PreparedStatement를 사용하면 SQL 쿼리가 사전에 컴파일되므로 쿼리의 재사용이 가능하며, 이는 성능 향상을 가져올 수 있다.
  • 데이터베이스 연결을 안전하게 관리하기 위해 try-with-resources 문을 사용하여 자동으로 자원을 해제하는 것이 좋다.
반응형