# 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를 사용하여 사용자 이름에 해당하는 사용자를 검색한다.
여기에 대한 간략한 설명은 다음과 같다.
- 코드 시작 부분에서는 JDBC 드라이버를 등록하고, 데이터베이스에 연결하기 위한 필수 정보를 제공한다.
- main() 메서드에서는 데이터베이스 연결을 시도한다.
- conn.prepareStatement(sql) 메서드를 사용하여 Prepared Statement를 생성한다. 이때 SQL 쿼리에 매개변수를 삽입한다.
- **pstmt.setString(1, "user123")**와 같이 setString() 메서드를 사용하여 매개변수를 설정한다.
이 예제에서는 사용자 이름을 매개변수로 설정했다. - **pstmt.executeQuery()**를 호출하여 쿼리를 실행하고, 그 결과를 **ResultSet**에 저장.
- while (rs.next()) 루프를 사용하여 **ResultSet**에서 결과를 하나씩 가져와 출력.
Prepared Statement의 적용 방안은 다음과 같다:
- 사용자 입력을 SQL 쿼리에 직접 연결하는 대신, Prepared Statement를 사용하여 매개변수를 이용하여 쿼리를 작성한다. 이를 통해 SQL injection 공격을 방지할 수 있다.
- PreparedStatement를 사용하면 SQL 쿼리가 사전에 컴파일되므로 쿼리의 재사용이 가능하며, 이는 성능 향상을 가져올 수 있다.
- 데이터베이스 연결을 안전하게 관리하기 위해 try-with-resources 문을 사용하여 자동으로 자원을 해제하는 것이 좋다.
반응형