콘텐츠로 이동

보안 및 운영 — CodeIgniter 4용 NextPDF

이 페이지는 이 통합이 대응해야 할 위협을 나열하고, 패키지 소스에 구현된 제어를 명시하며, 안전한 배포를 위한 운영 규칙을 제공합니다.

공격자가 영향을 줄 수 있는 표면은 세 가지입니다.

  1. 큐 작업 페이로드. 큐는 작업 데이터를 저장합니다. 브로커 접근 권한이 있는 공격자는 해당 데이터를 변경할 수 있습니다. 이는 신뢰할 수 없는 역직렬화된 입력입니다.
  2. 응답 파일 이름. 사용자는 다운로드 파일 이름을 제공할 수 있습니다. 잘못된 이름으로 인해 헤더 콘텐츠가 주입될 수 있습니다.
  3. 구성 경로. 글꼴 경로와 서명 경로는 구성에서 가져옵니다. 잘못된 경로로 인해 의도하지 않은 위치를 읽거나 쓸 수 있습니다.

제어 1 — 큐 페이로드 허용 목록

섹션 제목: “제어 1 — 큐 페이로드 허용 목록”

큐 작업은 페이로드를 신뢰할 수 없는 역직렬화된 데이터로 취급합니다. OWASP ASVS는 역직렬화된 신뢰할 수 없는 데이터에 안전한 입력 처리를 요구합니다(ASVS V1.5.2).

다음은 GeneratePdfJob의 검증된 제어입니다:

  • 빌더는 비어 있지 않은 문자열이어야 합니다. 작업은 다른 유형을 거부합니다.
  • 빌더는 App\PdfBuilders\<Class>::<method> 패턴과 일치해야 합니다. 작업은 다른 네임스페이스나 일반 함수, 접두사 또는 접미사가 붙은 페이로드를 거부합니다.
  • 빌더는 호출 가능해야 합니다. 작업은 패턴에는 일치하지만 해석되지 않는 문자열을 거부합니다.

이러한 규칙은 변조된 큐 페이로드를 통한 임의 코드 실행을 차단합니다. 패키지 테스트는 각 거부 사례를 검증합니다.

작업은 파일을 디스크에 기록합니다. OWASP ASVS는 애플리케이션이 파일 작업용 파일 경로를 생성할 때 안전한 경로 처리를 요구합니다(ASVS V5.3.2).

다음은 GeneratePdfJob의 검증된 제어입니다:

  • 출력 경로는 비어 있지 않은 문자열이어야 합니다.
  • 작업은 경로를 정규화합니다. 검사하기 전에 ... 세그먼트를 해석하고 구분 기호를 변환합니다.
  • 정규화된 경로는 WRITEPATH/pdfs/ 안에 있어야 합니다. 작업은 이름 접두사가 같은 형제 디렉터리(pdfs-evil/)를 거부합니다.
  • 경로는 .pdf로 끝나야 합니다(대소문자 구분 없음).

이러한 규칙은 변조된 페이로드를 통한 임의 파일 쓰기를 차단합니다.

PdfResponse는 모든 PDF 응답에 고정된 헤더 집합을 추가합니다:

헤더
X-Content-Type-Optionsnosniff
X-Frame-OptionsDENY
Content-Security-Policydefault-src 'none'
X-Robots-Tagnoindex, nofollow
Referrer-Policyno-referrer
Cache-Controlprivate, max-age=0, must-revalidate

파일 이름은 헤더에 들어가기 전에 정제됩니다. 패키지는 경로 구분 기호, 널 바이트 및 CR/LF를 제거합니다. 인용 형식에 맞게 큰따옴표를 이스케이프합니다. 비 ASCII 이름에는 RFC 5987의 filename*=UTF-8''… 매개변수를 추가합니다. 빈 이름은 document.pdf가 됩니다.

글꼴 레지스트리는 fontsPath에 스트림 래퍼(://)나 널 바이트가 포함되어 있으면 거부하고 런타임 오류를 발생시킵니다. 이는 php:// 또는 phar://와 같은 래핑된 경로를 차단합니다.

제어 5 — 최소 서비스 로케이터 표면

섹션 제목: “제어 5 — 최소 서비스 로케이터 표면”

CodeIgniter 4에는 PSR-11 컨테이너가 없으며 Services 로케이터를 사용합니다. PSR-11 §1.3은 서비스 로케이터 패턴을 권장하지 않는 것으로 다룹니다(SHOULD NOT 규범). 패키지는 로케이터 표면을 작게 유지합니다. 각 서비스는 하나의 명명된 팩토리 메서드입니다. 서비스는 컨트롤러 경계에서 해석하십시오. 구체 객체를 안쪽으로 전달하십시오. 도메인 코드에는 Services 클래스를 전달하지 마십시오.

서명 및 TSA 작업(NextPDF Pro / Enterprise)

섹션 제목: “서명 및 TSA 작업(NextPDF Pro / Enterprise)”

서명 서비스는 기본적으로 비활성화되어 있습니다. signature.enabledtrue이고 signature.certificate가 비어 있지 않은 경우에만 활성화됩니다. 패키지의 기본 서명 수준은 B-B입니다. NextPDF Pro는 B-B 베이스라인 서명을 제공합니다. 장기 검증은 별도의 Enterprise 기능입니다. 이는 여기가 아닌 Premium 참조 문서에 기재되어 있습니다.

운영 규칙:

  • 인증서와 키 파일은 소스 제어에서 제외하십시오. .env 또는 비밀 관리자를 통해 제공하십시오.
  • 프로덕션에서는 tsa.allow_insecure_httpfalse로 유지하십시오. 평문 TSA 채널은 허용되지 않습니다.
  • TSA가 안정적인 키를 게시할 때 tsa.pinned_public_keys를 설정하십시오. tsa.warn_on_key_rotationtrue로 유지하십시오.
  • 키 파일의 읽기 접근 권한은 애플리케이션 사용자로 제한하십시오.
  • 해결된 모든 버전을 composer.lock에 고정하십시오.
  • 워커를 실행하는 애플리케이션에서는 codeigniter4/queue를 필수로 지정하십시오.
  • 큐 워커를 낮은 권한 사용자로 실행하십시오. WRITEPATH/pdfs/에 대한 쓰기 접근 권한만 부여하십시오.
  • 워커에도 웹 계층과 동일한 NextPDF 확장을 제공하십시오. 서명된 PDF에는 워커 환경에 NextPDF Pro 또는 Enterprise가 필요합니다.
  • PDF를 빌드하는 모든 런타임에서 mbstringzlib 확장을 확인하십시오.
  • 응답 헤더가 역방향 프록시를 통과하는지 확인하십시오.
  • PDF 생성은 컨텍스트와 함께 로깅하십시오. 인증서 자료나 키 비밀번호를 로깅하지 마십시오.
  • 큐 페이로드 처리는 OWASP ASVS V1.5.2를 따릅니다.
  • 큐 출력 경로 처리는 OWASP ASVS V5.3.2를 따릅니다.
  • 로케이터 설계는 PSR-11 §1.3 지침을 따릅니다.

NextPDF 코어는 Apache-2.0입니다. 서명 신뢰 앵커와 TSA 강화는 NextPDF Pro 또는 Enterprise가 설치된 경우에 적용됩니다. CodeIgniter 패키지는 해당 서비스 메서드를 노출하며, 일치하는 Premium 패키지가 설치될 때까지 null을 반환합니다. </get-license/?intent=codeigniter-signing>를 참조하십시오.

  • /integrations/codeigniter/production-usage/ — 올바른 큐 등록 및 디스패치.
  • /integrations/codeigniter/configuration/ — 서명, TSA 및 경로 키.
  • /integrations/codeigniter/troubleshooting/ — 검증된 거부 메시지.
  • /integrations/codeigniter/overview/ — 전체 API 표면.