管理系秘匿設定の外部ファイル化構想メモ
2026-07-19 JST
（構想段階。実装はまだ行っていない。メンテナー（基さん）の判断待ち）


1. 問題意識
------------------------------------------------------------
今回のセッションで、conf.phpのパス系設定を巡る一連の事故
（過去ログ出力失敗、カウンターエラー、install.phpの新規キー
穴埋め処理の問題、migrate.phpの自動パス書き換え）を扱った。

これとは別に、ADMINKEY（管理人投稿モード移行用キーワード）が
conf.php内に平文で保存され、crypt比較ではなく単純な文字列比較で
照合されている点がkaguya氏の指摘・基さんとの確認により判明した
（README.md ToDo参照）。

ここから、そもそも管理系の秘匿情報（ADMINPOST・ADMINKEYなど）を
conf.php本体から切り離し、外部ファイル化してはどうか、という構想が
出た。理由：
  * conf.phpはinstall.phpのマージ処理（バックアップ・上書き・
    新規キー穴埋め等）の対象であり、今回のような「意図せず値が
    変わる／消える」事故のリスクを本質的に抱えている。
  * 管理系の秘匿情報は、そもそもこのマージ処理の対象から完全に
    外してしまえば、同種の事故が構造的に起こり得なくなる。


2. 検討した論点
------------------------------------------------------------

[a] ファイル形式：PHPファイル vs 単純テキスト/iniファイル

  * PHPファイル案：
      return array('ADMINPOST' => '...', 'ADMINKEY' => '...');
    のような形式で、bbs.php側からrequireして読み込む。
    PHPソースはWebサーバーが（正しく設定されている限り）実行される
    ものであり、直接内容がブラウザへ返される経路が構造的に存在
    しない。

  * テキスト/ini案：
    .htaccessによる`deny all`が確実に効くことが前提になる。
    今回のセッション中、.htaccessのphp_value指定が環境によって
    500エラーになったり、.user.iniでないと効かない共有レンタル
    サーバーに遭遇した実例があった。つまり.htaccessが効かない
    環境は現実に有り得ることが今回のセッションで確認できている。

  * 現時点での印象：
    PHPファイル形式の方が、.htaccessの設定ミスや対象サーバーの
    仕様差异に対して構造的に強い（.htaccessは保険として併用する
    位置づけ）。ただしこれはメンテナーの判断が必要な点。

[b] install.phpの視界から外す

  この外部ファイルは、newbbs/テンプレートに一切含めない
  （data/・logs/等の実データファイルと同じ思想）。そうすれば
  install.phpの$files一覧（テンプレートに実在するファイルのみを
  走査するksphp_install_list_files()）に一切現れず、コピー・
  バックアップ・上書きの対象にならない。「パス指定は弄らない」
  と同じ発想で、「存在自体をinstall.phpに気づかせない」ことが
  事故を避ける一番確実な方法だと考えられる。

[c] ファイル名

  あまり「意味ありげ」な名前（admin.php等）だと、逆に狙われやすい
  可能性がある。命名規則をどうするか（他のconf.php等に紛れさせる
  か、逆に特徴的な名前にして.gitignore的な除外リストで確実に
  管理するか）は未確定。

[d] 対象範囲

  ADMINPOST・ADMINKEYの2つが対象候補。ADMINNAME・ADMINMAILの
  ような非秘匿の管理設定は、これまで通りconf.phpに残す想定
  （未確定、要確認）。


3. 現状のステータス
------------------------------------------------------------
構想段階。実装は行っていない。上記[a]〜[d]について、メンテナー
（基さん）の意見・判断を待って詳細設計に進む。


4. 関連
------------------------------------------------------------
README.md ToDo: ADMINKEYの平文比較に関するセキュリティ懸念の記録
（2026-07-19）から派生した構想。


5. 実装済み（2026-07-20 追記）
------------------------------------------------------------
上記[a]〜[d]について、基さんとの協議の結果、以下の形で実装した。

[a] ファイル形式：PHPファイル案を採用（local.php、return array()形式）
[b] install.php対象外化：newbbs/テンプレートにlocal.phpを含めない
    ことで対応（想定通り、追加の除外処理は不要だった）
[c] ファイル名：秘匿データ本体（local.php）は固定名のまま据え置き。
    難読化・改名の対象は「パスワード設定/変更ツール」の方に限定
    （初期名_setup.php→設置者が指定した名前へrename）。デフォルト
    改名候補はhash('sha256', date('YmdHi').$SETUP_SEED)の先頭12文字
    ＋.php（$SETUP_SEEDはツール内で編集可能）。
[d] 対象範囲：ADMINPOST・ADMINKEYの2つのみ。ADMINNAME・ADMINMAILは
    従来通りconf.phpに残置。

さらに、install.php依存の廃止（パスワード機構を完全に独立させる）
という当初想定を超えた合意事項として、「local.php不在時は誰でも
新規設定可、存在後は現行パスワードでのログインが必須」という運用
（案1、基さん決定）を採用。案2（設置者だけが知る合言葉必須）は
導入の敷居が上がるため不採用。

実装ファイル：newbbs/_setup.php（新規）、newbbs/bbs.php（ADMINPOST
未設定時の埋め込み設定フローを案内メッセージに置換、local.php読込
処理を追加）、newbbs/conf.php（ADMINPOST/ADMINKEY記述を削除）。
