# 個人用LOGの監査記録

2026年10月4日、`feature/personal-log-cms` ブランチの開発版を検証しました。
機能監査と敵対検証は別Agentが担当し、プレビューとは別の保存先・ポートを使いました。
監査では実装を変更せず、見つかった問題を親Agentが修正した後、独立コピーで再確認しました。

## 管理者用Memoと削除管理の追加監査

公開ページでの管理者投稿、Memo、フッター、分類の並び替え、一括削除、専用画像の掃除、404、ローカル起動を追加した版を、別Agentが新しい保存先で繰り返し検証しました。

| 試験 | 結果 | 確認した範囲 |
| --- | --- | --- |
| LOG回帰 | 153/153を2回通過 | 投稿、編集、画像、分類、共有情報、ZIP、タイトルの分離 |
| 既存CMS回帰 | 186/186を2回通過 | 認証、漫画、EPUB、復元、ゲスト、更新、入力の悪用 |
| 管理者投稿・Memo | 93/93を2回通過 | 公開ページの管理者表示、匿名・ゲストの拒否、画像のキャッシュ、表示件数 |
| フッター・分類順序・記事削除 | 104/104を2回通過 | 表示設定、順序、型、共有画像、専用ファイル、空フォルダ、ZIP |
| 起動と再起動 | 6/6を2回通過 | 保存先の維持、再ログイン、使用中ポート、ループバック待受 |
| 故障を再現した削除 | 4/4を2回通過 | 一覧保存失敗後に原本・画像・受付記録を戻し、一時フォルダを除去 |
| 削除・並び順の敵対検証 | 68/68通過 | 認証、共有参照、専用画像、受付記録、途中失敗、入力と型 |
| JSON・更新番号の追加境界試験 | 50/50通過 | 数値キーのobject、不正な配列・更新番号、拒否後のデータ不変 |

機能監査は計546項目を各2回通過しました。終了時の実装39ファイルは親のソースと一致し、実行記録21本にPHPの異常はありませんでした。
この版の後に加えたサイドバーについては、次の追加監査を行っています。

数字だけの画像IDがPHPの配列キーで整数になる条件を修正しました。
削除や巻き戻しの際、空の`index.html`だけが残るフォルダも整理します。
共有の確認には投稿の原本を使い、古い一覧情報だけに依存しません。
JSONの最上位の型を確認し、数値キーのobjectを削除用listとして受け入れないようにしました。

削除確認はページ内のダイアログです。親Agentがキャンセル、Esc、初期フォーカス、選択件数、単体削除をブラウザで確認しました。
以前のブラウザ標準確認でOKを押した操作は、検証用コピーだけに反映されました。
5197番の元の保存先にある5件の投稿原本は保持しています。

## サイドバーとHTML枠の追加監査

標準7項目の並び替えと表示切替、HTML枠の追加、3つのテンプレート、画像参照、ZIPを追加した版も、別の保存先で検証しました。
機能試験は88/88を2回通過しました。最後の画像URL判定の修正後は、削除104項目も2回再確認しています。
変更のない回帰試験186・153・93・6・4項目の各2回と合わせ、634項目を各2回確認しています。
実装40ファイルのハッシュが一致し、PHP・起動の65記録に異常はありませんでした。
敵対検証は153/153を通過し、33種類のHTML入力を保存・表示・再処理で確認しています。
全体の入力が1048574バイトの設定も保存でき、1050201バイトの`backup.json`を含む自己ZIPを復元できました。

HTMLを安全化すると、`&`などの文字が展開して長くなる場合があります。
安全化後にも1枠50KBを確認し、自分で作ったZIPを復元できない条件を修正しました。
`./log.php`、`/./`、`viewer/../`、`./index.php`、`./%2e/`による画像URLの別表記も、共有画像として保護します。
画像タグのない画像リンクも、公開判定と削除保護へ含めています。
旧形式のZIPではサイドバーを保ち、異常なZIPや復元途中の失敗では元の記録を維持します。
ZIP内の数値キーobjectも、JSON配列の代わりに受け入れません。
HTTPSの443番・HTTPの80番は、指定した場合と省略した場合を同じURLとして比べます。
日本語の設置先パスも、URLの文字表記をそろえて共有参照を確認します。
別のドメイン・通信方式・ポートのURLは、その設置先のLOG画像として扱いません。
画像一覧にはサイドバーでの使用も表示し、使っている画像の削除ボタンを無効にします。

親Agentは390×844のブラウザで、実際のドラッグ、上下移動、グリッドとバナーの追加・保存・公開表示を確認しました。
グリッドは2列で、バナーの枠は0px・背景は透明でした。
別タブの古い更新番号では上書きせず、理由を表示します。
投稿一覧のSVG付きボタン16個は、ボタンとSVGの縦中央の差が0pxでした。
実機のタッチ操作と、ブラウザ内で攻撃用HTMLを実行する検査は未実施です。

最終の構文確認はPHP20ファイル・JS6ファイルを通過しました。
配布ZIPの必須23ファイルとソースの内容一致、実データが入らないことも確認しています。
更新機能によるZIP検査では、プログラム42ファイルを読み込めました。

## 初期CMSの監査結果

| 担当・試験 | 結果 | 確認した範囲 |
| --- | --- | --- |
| 機能監査Agent・LOG | 153/153を2回通過 | 投稿、編集、同時保存、非公開化、画像、漫画参照、分類、表示設定、OGP、URL、復元、BOT対策、タイトルと本文の分離 |
| 機能監査Agent・既存CMS | 186/186を2回通過 | 既存の認証、画像・EPUB、ZIP復元、ゲスト、更新、入力の悪用など |
| 敵対検証Agent | 修正後99/99通過 | 不正入力、XSS、CSRF、認証、秘密データ、Zip Slip、壊れた復元、IP・UA偽装、拒否期限、タイトル行への注入など |
| 親Agent・LOG回帰試験 | 153/153通過 | 数値カテゴリの旧形式読み取り、同秒100件以上、公開ルート、最新3件の完全一致、表示分離の8項目を含む |
| 親Agent・ブラウザ | 操作を確認 | 390×844の投稿欄、太字、画像追加、漫画選択、保存、分類、公開一覧、画像拡大、漫画ビューアー、設定 |
| 親Agent・構文と配布ZIP | 通過 | PHP19ファイル、JS4ファイル、必須21ファイル、実装との内容一致、更新用のZIP読み込み40ファイル |

機能監査Agentは、最終コピーの実装ファイルが親のソースと一致することもハッシュで確認しました。
PHPログにFatal、Warningなどがないことも確認しています。
テストを繰り返した結果は、実運用の安全性を保証するものではありません。

## 見つかった問題と修正

数字だけのカテゴリIDは、PHPの配列キーで整数になる場合がありました。
そのため、画面が途中で終わる、絞り込みに出ない、自分のバックアップを復元できない条件がありました。
IDを文字列にそろえ、以前の投稿と一覧ファイルも読み直せるようにしました。
公開・管理画面・絞り込み・別設置先への復元を再確認しています。

同じ秒の投稿IDを文字列順に並べると、100件目以降が99件目より古い位置に入りました。
日時の後に連番を数値として比べる順序へ変更し、最新投稿と最近のハッシュタグに反映しました。
101、100、99の順になることを確認しています。

試験側でも、旧URLの変換と、投稿IDの部分一致による誤判定を修正しました。
最新3件は、リンクの投稿IDと期待する順序を完全一致で確認します。

追加の依頼で、タイトルとして使う1行目を、本文にも出していた表示を修正しました。
公開・管理一覧・プレビューは1行目を見出し、2行目以降を本文として表示します。
1行目に画像や漫画のタグがある場合も、カードは本文へ残ります。
編集の原文、長い見出し、画像だけの投稿、一覧の旧キャッシュも確認しました。
この修正後に、機能監査153項目を2回、敵対検証99項目を再確認しています。

## 敵対検証で確認した限界

公開URLが空欄だと、canonicalとOGPがアクセス時のHostに依存します。
運用では、設定に固定の公開URLを入力してください。

`.htaccess` を無視する環境で、画像の実パスが判明すると、画像配信の認証・BOT対策を迂回できました。
LOG内部のPHP記録は404ですが、静的な画像にはその処理がありません。
保存領域を公開フォルダの外へ移すか、サーバーで直接アクセスを拒否する必要があります。

収集ツール名と大量取得は拒否できました。
UA、Cookie、偽の転送IP、クエリを変えても、同じIPの拒否期間は解除されませんでした。
普通のブラウザに偽装した低頻度・分散型BOTの完全な識別はできません。
BOTをすべて404にできるという保証はしていません。

## 未確認の範囲

実際のiPhone・Android、Apache・nginxでの設置、外部SNSのOGP取得は未確認です。
何万件もの投稿、多数の同時読者、長期運用、停電・ディスク故障からの復旧も未確認です。
設置先での確認と、定期的なバックアップが必要です。

## 再実行と証跡

主な試験は、次のコマンドで専用コピーを作って実行できます。

```text
python manga/dev/log_test.py
python manga/dev/attack_test.py
python manga/dev/log_management_test.py
python manga/dev/log_sidebar_test.py
python manga/dev/preview_test.py
```

詳細の実行記録は、ローカルの `manga/dev/results/` に保存しています。
`functional-audit.md`、`adversarial-audit.md`、`log-report.md` と、各試験コピーのログが証跡です。
このフォルダはGitの追跡対象に含めません。
追加機能の記録は`functional-audit.md`、`mutation-audit.md`、`mutation-boundary-audit.md`、`sidebar-html-audit.md`にも保存しています。
今回の独立した敵対検証スクリプトも、同じ場所の `adversarial_audit.py` に残しています。

仕様と運用手順は [個人用LOGのREADME](../README-LOG.md) を参照してください。
