버전 4.7.5
릴리스 날짜: 2026년 10월 9일
CodeIgniter4 4.7.5 릴리스
보안
CURLRequest: 요청이 예외를 던지고
shareOptions가false일 때, 요청별 헤더·본문·옵션이 이제 초기화됩니다. 이전에는 실패한 요청 이후 클라이언트를 재사용하면 인증 정보나 민감한 데이터가 다른 목적지로 전송될 수 있었습니다. 생성자에 전달된 옵션은 이후 요청에서도 계속 사용할 수 있습니다. 요청별baseURI와delay값도 성공·실패 요청 이후 모두 초기화되어, URI 구성 요소가 이후 요청으로 새어 들어가는 것을 방지합니다. 실패한 요청을 재시도할 때는 옵션을 다시 전달하거나setAuth(),setBody(),setForm(),setJSON()으로 설정한 값을 다시 적용하십시오. 자세한 내용은 보안 권고 GHSA-9g9v-xgwj-697h를 참조하십시오.Validation:
is_image와mime_in파일 업로드 규칙이 이제 마침표로 끝나는 클라이언트 파일명을 거부하며, 실제로 확장자가 없는 업로드는 계속 허용합니다. 이 규칙들과ext_in은shell.php.gif처럼 마지막 확장자 앞에 PHP 핸들러 확장자가 있는 파일명도 거부하며, 파일명 살균(sanitization)으로 드러나는 확장자도 포함됩니다. 이 검사는logo.php.gif같은 무해한 파일명도 거부합니다. 마이그레이션 방법은 4.7.4에서 4.7.5로 업그레이드를 참조하십시오. 이전에는 이런 이름을 가진 GIF/PHP 폴리글랏 파일이 유효성 검사를 통과할 수 있었습니다. 클라이언트가 제공한 이름으로 업로드를 스크립트 실행 가능한 공개 디렉터리에 저장하는 애플리케이션이 영향을 받을 수 있습니다. 생성된 파일명을 사용하거나 업로드 디렉터리에서 스크립트 실행을 비활성화하십시오. 자세한 내용은 보안 권고 GHSA-4hwf-v4mp-hf6c를 참조하십시오.Validation: 파일 유효성 검사 규칙이 이제 선택적 다중 업로드에서 비어있지 않은 모든 파일을 검사합니다. 이전에는
UPLOAD_ERR_NO_FILE항목이 있으면max_size,is_image,mime_in,ext_in,max_dims,min_dims가 이후 파일을 검사하지 않고 업로드를 통과시킬 수 있었습니다.max_dims와min_dims는 이제 이미지 크기를 읽기 전에UPLOAD_ERR_NO_FILE이외의 업로드 오류에 대해서도false를 반환합니다. 자세한 내용은 보안 권고 GHSA-cwxp-v62r-xwx2를 참조하십시오.View Parser: Parser 구문(예:
{text|raw}나{!text!})이 포함된 대체 값이 이후 대체 과정에서 다시 해석되어, 사용자 제공 데이터가 다른 의사 변수의 자동 이스케이프를 우회할 수 있었던 저장형 XSS 취약점을 수정했습니다. 대체 값은 이제 엄격하게 데이터로만 취급되며 다시 파싱되지 않습니다. 동일한 보호 조치가 URL이나 검증 메시지를 포함한 내장 Parser 플러그인의 출력에도 적용됩니다. 자세한 내용은 View Parser가 더 이상 대체된 값을 파싱하지 않음를 참조하십시오. 자세한 내용은 보안 권고 GHSA-vgrf-mv2j-gp8w를 참조하십시오.View Parser: Parser 템플릿 원본을 통한 코드 인젝션에 대한 선택적(opt-in) 완화책으로 제한된 조건문(restricted conditionals)을 추가했습니다.
{if ...}와{elseif ...}태그의 조건은 PHP로 평가되므로, Parser 템플릿 원본을 편집할 수 있는 사람은 누구나 PHP 코드를 실행할 수 있습니다. 이는 여전히 기본 동작입니다. 신뢰도가 낮은 사용자가 Parser 템플릿을 편집하게 하는 애플리케이션은 새로운Config\\View::$restrictParserConditionals설정이나restrictConditionals렌더링 옵션을 활성화해야 합니다. 제한된 조건문은 이 실행 경로만 제한할 뿐, 신뢰도가 낮은 작성자에게 모든 템플릿 기능을 안전하게 만들어주지는 않습니다. 이 제한은 동일한 Parser 인스턴스의 중첩 렌더링에도 적용됩니다. 자세한 내용은 조건문 제한하기와 보안 권고 GHSA-4q58-jw8x-8cm7를 참조하십시오.Views: 뷰 데이터 키가 렌더러 내부의 지역 변수를 덮어써서 발생하던 코드 실행 취약점을 수정했습니다.
Parser에서는template,View::renderString()에서는view라는 이름의 데이터가 PHP로 평가되는 소스를 대체할 수 있었습니다. 뷰 셀(view cell)에서는foundView라는 이름의 데이터가 선택된 파일 경로를 대체해 의도치 않은 로컬 파일 포함(local file inclusion)을 유발할 수 있었습니다. 이 문제들은 애플리케이션이 해당 키로 신뢰도가 낮은 데이터를 전달해야만 발생합니다. 자세한 내용은 보안 권고 GHSA-c29x-ffjj-8r7x를 참조하십시오.
메시지 변경사항
CLI.generator.undefinedDatabaseGroup과CLI.generator.unsupportedSessionDriver메시지 문자열이 추가되었습니다.Cookie.invalidCookieDomain메시지 문자열이 추가되었습니다.Cookie.invalidCookiePath메시지 문자열이 추가되었습니다.Cookie.invalidCookieValue메시지 문자열이 추가되었습니다.View.restrictedConditional메시지 문자열이 추가되었습니다.
변경 사항
Response:
setJSON()과setXML(), 그리고JSONFormatter와XMLFormatter가 구현하는FormatterInterface::format()계약(contract)의 body/data 매개변수 타입이array|object|string대신mixed로 바뀌어, 런타임에 실제로 허용되던 값(예: 스칼라나bool)과 일치하게 되었습니다.
사용 중단
Debug Toolbar: 사용되지 않는
CodeIgniter\Debug\Toolbar\Collectors\Views::$views프로퍼티를 더 이상 사용하지 않도록(deprecated) 처리했습니다.
버그 수정
Autoloader:
FileLocatorCached::deleteCache()가 삭제된 데이터를 메모리에 남겨두어, 종료 시 캐시 파일에 다시 기록될 수 있던 버그를 수정했습니다.spark optimize와spark cache:clear는 이제 별도의 인스턴스가 아니라 공유된 locator의 캐시를 지웁니다.BaseModel: 연결(connection)의
dateFormat마스크에.v/.u가 포함된'datetime'$dateFormat에서, 자동 생성되는created_at/updated_at타임스탬프가 실제 1초 미만 값 대신 항상.000000으로 표시되던 버그를 수정했습니다.Cache:
MemcachedHandler::decrement()가 존재하지 않는 카운터를 양수 오프셋 값으로 초기화하던 버그를 수정했습니다. 이제 없는 카운터는 Memcached의 부호 없는(unsigned) 포화(saturating) 카운터 방식에 맞춰0으로 초기화됩니다.CLI:
readline확장이 활성화된 상태에서CLI::prompt()에서 백스페이스를 누르면 프롬프트 텍스트가 지워지던 버그를 수정했습니다. 이제 프롬프트를readline()에 전달하여 줄을 다시 그릴 때 프롬프트도 함께 다시 그려집니다. 프롬프트 안의 ANSI 색상 코드(예: 옵션 기본값)는 GNU readline에서 커서 위치가 정확하게 유지되도록 readline의 비출력(non-printing) 마커로 감쌉니다. WinEditLine 기반으로readline확장이 빌드되는 Windows에서는, WinEditLine이 라이브러리 버전을 보고하지 않고 ANSI 시퀀스를 그대로 출력하기 때문에 프롬프트를 먼저 STDOUT에 씁니다.CLI:
readline확장이 활성화된 상태에서 STDIN이 파일 끝(예: Ctrl+D)에 도달했을 때CLI::input()과CLI::prompt()에서TypeError가 발생하던 버그를 수정했습니다. 이제readline이 없을 때와 동일하게 빈 문자열을 반환합니다.CLI: 컨트롤러 안의
command()등을 통해 명령이 CLI 바깥에서 실행될 때, 정의되지 않은STDERR상수 때문에CLI::error()가Error를 던지던 버그를 수정했습니다. 이제 다른 출력과 동일하게 메시지가 기록됩니다. Windows의CLI::clearScreen()과SignalTrait::getProcessState()도 CLI 바깥에서는 표준 스트림을 더 이상 확인하지 않습니다.CLIRequest:
argv가 없을 때parseCommand()에서 TypeError가 발생할 수 있던 버그를 수정했습니다.CodeIgniter:
startController()가ResponseInterface를 반환할 때(예: 필터 속성이나 클로저 라우트에서)gatherOutput()이 두 번 호출될 수 있던 버그를 수정했습니다.Commands: 데이터베이스 그룹의 드라이버가
MySQLi나Postgre가 아닐 때make:migration --session이 조용히 깨진 마이그레이션을 생성하던 버그를 수정했습니다. 이제 이 명령은 오류를 보고하고EXIT_ERROR를 반환합니다.Content Security Policy: 해당하는 값이 없을 때 빈
Content-Security-Policy,Content-Security-Policy-Report-Only,Reporting-Endpoints응답 헤더가 생성되던 버그를 수정했습니다.Cookie:
raw: true로 생성된Cookie인스턴스가setrawcookie()가 거부하는 잘못된 문자를 쿠키 값에 허용하던 버그를 수정했습니다.Cookie:
Cookie인스턴스가setcookie()와setrawcookie()가 거부하는 잘못된 문자를 path, domain, prefix 속성에 허용하던 버그를 수정했습니다.Database:
DBPrefix가 설정된 상태에서 SQLite3 테이블을 재구성(예:Forge::dropColumn(),Forge::modifyColumn(),Forge::dropForeignKey(),Forge::dropPrimaryKey())할 때, 외래 키가 참조하는 테이블 이름이 손상되던 버그를 수정했습니다.Database:
DBDebug가 활성화되고 PHP 경고가 비활성화된 상태에서 Postgre 쿼리 실패가 조용히 무시되던 버그를 수정했습니다. 이제DatabaseException이 발생합니다.Database: Postgre, SQLSRV, SQLite3에서 스키마가 포함된(schema-qualified) 테이블 이름에 대해
getFieldData()가 실패하던 버그와,protectIdentifiers()가 점으로 구분된 식별자 중 이미 보호된 부분에 접두사를 다시 붙이던 버그를 수정했습니다.Database:
UNION ALL서브쿼리 값이 컬럼 타입으로 캐스팅되지 않아, 행마다 같은 컬럼에 서로 다른 PHP 타입(예: 문자열과 정수)을 전달하면 PostgreSQL과 Oracle에서updateBatch()와deleteBatch()가 실패하던 버그를 수정했습니다.Debug:
Timer::start()가0.0을 빈 값으로 취급해 현재 시각으로 대체하던 버그를 수정했습니다.Files:
File::move()와UploadedFile::move()가 파일 권한을 실행 가능하고 지나치게 허용적인 값(0666 & ~umask()대신0777 & ~umask())으로 설정하던 버그와,UploadedFile::move()가chmod()대상을 대상 파일이 아니라 상위 디렉터리로 지정하던 버그를 수정했습니다.Helpers:
get_dir_file_info()가 하위 디렉터리와 존재하지 않는 파일을 생략하지 않고 불완전한 항목으로 반환하던 버그를 수정했습니다.Helpers: 글자 수 제한이 2 미만일 때
word_wrap()이 무한 루프에 빠지던 버그를 수정했습니다. 이제 이런 경우 너무 긴 단어는 그대로 유지됩니다.Honeypot: 봇 감지 시 403(Forbidden) 대신 HTTP 500 응답을 반환하던 버그를 수정했습니다.
I18n:
Time::today(),Time::yesterday(),Time::tomorrow()가 날짜를 계산할 때 지정된$timezone과setTestNow()를 무시하던 버그를 수정했습니다.Logger: 배열이나 문자열로 변환할 수 없는 컨텍스트 값으로 로그 메시지를 보간(interpolate)할 때 PHP 경고나 오류가 발생할 수 있던 버그를 수정했습니다.
Validation:
valid_cc_number가 카드 번호에 숫자가 아닌 문자(예: 소수점)를 허용하던 버그를 수정했습니다. 그런 값이 Luhn 검사를 통과하면서 내부적으로Undefined array key경고를 유발할 수 있었는데, 이제ctype_digit()로 검사합니다.View Parser: 템플릿 주석을 제거하는 과정에서 PHP 태그가 조합되어 실행될 수 있던 버그를 수정했습니다. 이제 주석 제거 후 PHP 태그를 이스케이프합니다.
수정된 버그의 전체 목록은 저장소의 CHANGELOG.md를 참고하세요.