DSc T2Editor Developers
DocumentationSecurity
Security

보안 경계와 엔드포인트 개발

업로드, HTML, URL, 실행 엔드포인트, 관리자·ZIP 설치의 검증 규칙을 모았습니다.

보안 경계와 엔드포인트 개발

요청 경계

  • 상태 변경은 세션, 권한, CSRF, HTTP 메서드를 함께 확인한다.
  • Origin은 명시 allowlist 또는 동일 호스트 정책으로 검증하고 프록시 환경의 전달 헤더는 신뢰 프록시 설정 없이 믿지 않는다.
  • HTTP_HOST는 URL 생성 전에 허용 문자로 검증한다.
  • 응답에는 적절한 Content-Type, nosniff, 관리자 화면에는 frame 차단을 적용한다.

HTML과 외부 URL

클라이언트 sanitizer는 UX를 위한 첫 경계이고 서버 정제가 최종 경계다. script, 이벤트 속성, srcdoc, 위험 프로토콜을 제거한다. 외부 URL은 현재 호스트와 T2EDITOR_ALLOWED_URL_DOMAINS, iframe은 별도 T2EDITOR_ALLOWED_IFRAME_DOMAINS를 기준으로 검사한다.

업로드

확장자와 브라우저 MIME만으로 판단하지 않는다. upload_config.php는 헤더 시그니처와 getimagesize() 결과가 일치하는지, 폭·높이와 총 픽셀 수가 제한 안인지 확인한다. 파일명은 새로 생성하고 원본명은 표시 메타데이터로만 사용한다.

브라우저가 WebP로 변환했어도 서버가 다시 검사한다. 브라우저 변환이 실패하거나 지원되지 않으면 서버 GD가 지원하는 형식만 변환하고, 둘 다 불가능하면 조작된 확장자로 저장하지 말고 명확한 오류를 반환한다.

PHP 엔드포인트

일반 공개 래퍼는 config/extend.php를 통해 같은 상대 경로의 .core.php로 전달된다. 경로는 base 또는 선택 runtime 내부여야 하고 심볼릭 링크와 ..를 허용하지 않는다.

플러그인의 임의 PHP 파일을 URL로 직접 실행하지 않는다. run.php는 설치 레지스트리와 package.jsonruntime.entries에 선언된 이름만 허용하고 실제 파일이 플러그인 루트 안에 있는지 다시 확인한다.

마켓 ZIP

마켓 설치기는 절대경로·상위 이동·중복 경로·심볼릭 링크·서버 설정 파일을 거부한다. 파일 2,000개, 압축 해제 합계 120MiB 제한을 적용하고 manifest가 허용한 설치 구조 밖의 파일을 거부한다. 직접 설치 때에는 기존 코어·수동 설치 경로를 덮지 않고 소유 레지스트리가 확인되는 항목만 교체한다.

기술 기준

T2Editor 10.4.0을 기반으로 작성되었으며, 동일한 구조와 계약을 유지하는 이후 버전에도 적용됩니다.

T2Editor 홈으로