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();
}
}
}
입력값을 연결하는 대신 물음표(?)를 사용하세요.
createStatement() 대신 prepareStatement(query)를 사용합니다.
물음표 위치에 실제 값을 할당합니다.
현재 코드는 문자열 결합을 통해 SQL 쿼리를 동적으로 생성하고 있습니다. 이는 SQL Injection 공격에 매우 취약합니다. PreparedStatement와 ? 바인딩 변수를 사용하여 쿼리의 구조와 데이터를 분리하세요.
Dynamic SQL Generation
입력값 userId가 검증 없이 쿼리에 포함됩니다. 만약 입력값이 admin' --라면, 비밀번호 검증 없이 관리자 계정으로 로그인이 가능해집니다.