Skip to content

MoniWiki System Overview

Won-Kyu Park edited this page Aug 8, 2026 · 2 revisions

MoniWiki 시스템 개요

이 문서는 현재 소스코드 기준 MoniWiki 런타임을 설명한다. 제안서가 아니라 현재 구현 문서다.

진입점

  • wiki.php는 기본 웹 진입점이다. 설정을 읽고, WikiDB를 만들고, 요청/사용자 상태를 초기화하고, 세션 쿠키를 처리한 뒤 캐시 헤더를 설정하고 wiki_main($options)를 호출한다.
  • wikilib.php는 공용 요청 action과 사용자 helper를 담는다. 주요 예시는 WikiUser, do_goto(), do_post_savepage(), ajax_savepage(), do_post_DeleteFile()이다.
  • plugin/*.php 파일은 action, macro, processor 확장을 제공한다. wiki.phpgetPlugin(), getProcessor(), getFilter()로 plugin 이름을 찾는다.
  • lib/cache.text.php는 캐시된 설정, 페이지 HTML, PI metadata, dynamic macro metadata를 저장한다.

런타임 계층

flowchart TD
    Request["HTTP 요청"] --> Bootstrap["wiki.php bootstrap"]
    Bootstrap --> Config["config.php + site 설정 cache"]
    Config --> DBInfo["WikiDB"]
    DBInfo --> UserInit["init_requests(options)"]
    UserInit --> Session["session cookie 검사"]
    Session --> Headers["초기 cache/CORS header"]
    Headers --> Main["wiki_main(options)"]
    Main --> Security["DBInfo->security"]
    Main --> Formatter["Formatter"]
    Formatter --> Page["WikiPage"]
    Main --> Plugins["plugin action/macro/processor"]
Loading

중앙의 변경 가능한 요청 context는 $options다. wiki.php에서 작은 배열로 시작하고, init_requests()에서 채워진 뒤 wiki_main(), 권한 검사, formatter rendering, action handler로 전달된다.

확장 조회

getPlugin(), getProcessor(), getFilter()는 설정된 include path를 훑고 발견한 basename map을 캐시한다. Action dispatch는 요청 path를 직접 include하지 않고, action을 알려진 plugin basename으로 해석한 뒤 include_once("plugin/$pn.php")를 호출한다.

따라서 dynamic include 위험은 개별 action 호출 지점만이 아니라 resolver 경계와 설정으로 제어되는 include path를 함께 검토해야 한다.

현재 요청 경계

현재 요청 경계는 여러 위치로 나뉘어 있다.

  • init_requests()MONI_ID에서 WikiUser를 만들고 $options['id']를 채운다.
  • PHP session을 사용하는 경우 _session_start()가 추가 MONIWIKI session cookie를 검증한다.
  • wiki_main()은 요청 parsing, blocklist 검사, robot 처리, read 검사, action 권한 검사를 수행한다.
  • wikilib.php와 plugin의 action handler는 writable(), protected admin password 검사, upload 검증, save hash 검사 같은 action별 검사를 수행한다.

이후 수정에서도 identity와 요청 상태는 action 권한 검사 전에 정규화하는 방향을 유지해야 한다. 파일이나 출력 sink에는 개별 plugin 수정도 필요하지만, 첫 번째 방어선은 중앙 요청 경계여야 한다.

Clone this wiki locally