4.7.4에서 4.7.5로 업그레이드

설치 방법에 해당하는 업그레이드 지침을 참조하십시오.

주요 변경사항

View Parser가 더 이상 대체된 값을 파싱하지 않음

보안상의 이유로, Parser는 이제 대체되는 모든 값을 엄격하게 데이터로만 취급합니다. {name}, {!name!}, {name|upper}같은 Parser 구문이 포함된 값은 그대로 출력되며, 이후 대체 과정에서 다시 파싱되지 않습니다. 자세한 내용은 보안 권고 GHSA-vgrf-mv2j-gp8w를 참조하십시오.

이전에는 데이터 배열에서 키의 순서에 따라 이런 값이 다시 파싱될 수 있었습니다. 이 동작은 문서화된 적이 없었지만, 이에 의존하던 코드는 이제 플레이스홀더를 그대로 출력하게 됩니다. 예를 들어 다음 코드는 예전에는 <p>Hello, Bob!</p>을 렌더링했지만 이제는 <p>Hello, {name}!</p>을 렌더링합니다:

$parser->setData([
    'greeting' => 'Hello, {name}!',
    'name'     => 'Bob',
])->renderString('<p>{greeting}</p>');

렌더링된 템플릿 조각을 다른 템플릿에 삽입해야 한다면, 먼저 그 조각을 렌더링한 뒤 결과를 값으로 전달하면서 {! !} 구문을 사용해 다시 이스케이프되지 않도록 하세요:

$greeting = $parser->setData(['name' => 'Bob'])->renderString('Hello, {name}!');

$parser->setData(['greeting' => $greeting])->renderString('<p>{! greeting !}</p>');

내장 Parser 플러그인 출력

내장 Parser 플러그인의 출력은 이제 렌더링된 데이터로 취급되어 Parser 구문으로 다시 처리되지 않습니다. 이로써 URL이나 검증 메시지 같은 값이 변수나 플러그인 지시문을 끌어들이는 것을 방지합니다. 내장 플러그인 출력 안의 플레이스홀더에 의존하던 애플리케이션은 해당 조각을 명시적으로 렌더링해야 합니다. 템플릿 코드를 변환하는 커스텀 플러그인은 기존 동작을 그대로 유지하며, 신뢰할 수 없는 데이터를 Parser 구문과 분리해서 관리할 책임이 있습니다.

파일 업로드 유효성 검사

is_image, mime_in, ext_in 규칙은 이제 마지막 확장자 앞에 PHP 핸들러 확장자가 있는 클라이언트 파일명을 거부합니다. 이는 sanitize_filename()에 의해 드러나는 확장자(예: shell.p$hp.gif가 shell.php.gif로 변환되는 경우)도 포함합니다. 마침표로 끝나는 파일명(마침표 뒤에 공백이 오는 경우 포함)도 거부됩니다.

이 검사들은 파일의 실제 내용이나 이름이 의도하는 의미와 무관하게 적용됩니다. 예를 들어 shell.php.gif뿐 아니라 logo.php.gif라는 무해한 PHP 로고 이름도 유효성 검사를 통과하지 못합니다. 후자가 실제로는 GIF 이미지만 담고 있어도 마찬가지입니다. 이런 파일은 업로드하기 전에 예를 들어 logo-php.gif처럼 이름을 바꾸세요. 파일을 저장할 때 생성된 파일명을 선택하더라도 이 검증 자체는 우회할 수 없는데, 이 검사는 파일이 저장되기 전에 클라이언트 파일명을 대상으로 실행되기 때문입니다.

동작 변경사항

요청 실패 후 CURLRequest 옵션

Config\CURLRequest::$shareOptions가 false일 때, 요청별 옵션은 이제 요청이 예외를 던지는 경우에도 초기화됩니다. 요청별 baseURI와 delay 값도 요청 성공·실패 여부와 관계없이 초기화됩니다. 생성자에 전달된 기본값은 이후 요청에서도 계속 사용할 수 있습니다.

애플리케이션이 실패한 요청을 재시도한다면, 옵션을 다시 전달하고 setAuth(), setBody(), setForm(), setJSON()으로 설정했던 값들도 다시 적용하세요. 실패한 요청의 인증 정보나 본문 데이터가 클라이언트에 남아있을 것이라고 가정하지 마세요.

프로젝트 파일

프로젝트 공간 (root, app, public, writable)의 일부 파일이 업데이트되었습니다. 이 파일들은 system 범위 밖에 있으므로 직접 개입하지 않으면 변경되지 않습니다.

참고

프로젝트 공간의 변경 사항 병합을 도와주는 서드파티 CodeIgniter 모듈이 있습니다: Packagist에서 탐색.

내용 변경사항

다음 파일들은 중요한 변경(사용 중단 또는 시각적 조정 포함)이 있었으며, 업데이트된 버전을 애플리케이션에 병합하는 것을 권장합니다:

설정

  • app/Config/View.php
    • Config\View::$restrictParserConditionals가 추가되었으며 기본값은 false입니다. 자세한 내용은 조건문 제한하기를 참조하십시오.

전체 변경사항

다음은 변경이 있었던 프로젝트 공간의 모든 파일 목록입니다; 많은 파일이 런타임에 영향을 미치지 않는 단순한 주석 또는 서식 변경입니다:

  • app/Config/View.php

  • app/Controllers/BaseController.php