ローカルWebアプリ 安全公開テンプレート — トンネル公開で認証がすり抜ける穴を塞いだ状態から始める
- Digital1,480 JPY
ローカルで動かしているWebアプリを、外部公開しても情報が漏れない状態から始めるためのテンプレートです。 Node.js標準モジュールのみで動作し、追加インストールは不要です。 ■ このテンプレートが防ぐ事故 ローカルアプリをトンネル(Tailscale Funnel / Cloudflare Tunnel / ngrok など)で公開すると、 素朴な実装では認証がすり抜けます。 原因は、トンネルが外部リクエストを 127.0.0.1 から転送するためです。 「ローカルからのアクセスは自分の操作だから信頼してよい」という判定が成立してしまい、 URLさえ知られれば誰でも書き込める状態になります。 // よくある危険なコード function isLocal(req) { return req.socket.remoteAddress === "127.0.0.1"; // 外部アクセスも true になる } このテンプレートは、中継を示すヘッダー(x-forwarded-for など)があれば外部として扱い、 必ず合言葉を要求します。公開してすぐ安全な状態から始められます。 ■ 入っているもの ・server.js 中継ヘッダーによる認証判定、合言葉の総当たり対策(5回失敗で15分ブロック)、 書き込みのレート制限、公開ファイルのホワイトリスト制御、セキュリティヘッダー。 ・safe-json.js JSONを台帳に使うときの安全な読み書き。「読み込み失敗を空配列で握りつぶし、 直後の書き込みで全データを消す」事故と、書き込み途中の破損を防ぎます。 ・public/index.html 動作確認ページ。ボタン1つで認証が効いているか試せます。 ・public/private.html 非公開ページの例。外部から合言葉なしでは開けません。 ・はじめに.md 3分セットアップ、設定項目の説明、公開後に必ず行う検証手順。 ■ 設計の要点 設定ファイルの publicFiles は「公開したいものを列挙する」方式です。 既定ではそれ以外すべてが非公開なので、うっかり公開する事故が構造的に起きません。 管理画面・帳簿・顧客データなどは、何も設定しなければ守られます。 ■ こんな方に ・ローカルで作ったツールを外出先からも使いたい ・トンネルで公開したが、認証が本当に効いているか不安 ・個人開発のアプリに、最低限の防御を後付けしたい ■ 必要なもの ・Node.js(追加パッケージのインストールは不要です) ■ ご注意 ・個人利用・小規模用途を想定しています。不特定多数への本格公開には、正式な認証基盤の導入をご検討ください。 ・購入者ご自身のプロジェクトには自由に組み込めます。テンプレート自体の再販・再配布はご遠慮ください。 ・不具合のご報告は無料で修正し、更新版をお渡しします。 ■ 制作者について 実際に運用しているシステムから生まれたテンプレートです。 ここで塞いでいる認証の穴は、私たちが自社システムを公開した直後の攻撃テストで発見し、修正したものです。 その経緯は技術記事として公開しています。 ```