Skip to content

fix(local): reject logical paths containing "." or ".." segments#758

Merged
YusukeHirao merged 2 commits into
devfrom
fix/local-reject-traversal-logical-path
May 8, 2026
Merged

fix(local): reject logical paths containing "." or ".." segments#758
YusukeHirao merged 2 commits into
devfrom
fix/local-reject-traversal-logical-path

Conversation

@YusukeHirao
Copy link
Copy Markdown
Member

Summary

Closes #755.

仮想ファイルツリーで POST /api/content/createPOST /api/content の論理パス(data.path および frontMatter[pathKey])に .. / . セグメントや NUL バイトが含まれていると、resolver にそのまま登録されてしまい、ブラウザがリンクを正規化したあと toDiskPath で見つからず、ファイルが「保存できたが UI から開けない孤児」になっていた。

  • route.tsxisSafeLogicalPath を追加し、apiSchema.path / createApiSchema.path の zod refine と、/api/contentfrontMatter[pathKey] ランタイムチェックの両方で利用
  • EmptyLogicalPathError の責務はそのまま(/ のみのパスは下流に任せる)。これは /foo.htmlfoo.html の正規化を壊さないため
  • 回帰テストを route.spec.ts に追加(create / save の両エンドポイント、複数の .././NUL パターン)

Test plan

  • npx vitest run src/route.spec.ts — 49 → 61 tests passing
  • yarn build --scope @burger-editor/local — typecheck + bundle 成功
  • 既存の「/foo.htmlfoo.html に正規化して受理」テストは引き続きパス

@YusukeHirao YusukeHirao merged commit e629562 into dev May 8, 2026
1 check passed
@YusukeHirao YusukeHirao deleted the fix/local-reject-traversal-logical-path branch May 8, 2026 14:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

@burger-editor/local: 仮想ツリーの logical path に '..' を許してしまう(UX 破綻)

1 participant