Burn-Link ·

URLの#以降がサーバーに届かない理由

ブラウザが HTTP リクエストを送るとき、# 以降はローカルに留まります。ワンタイムリンクは復号用の鍵を s.html?id={id}#{key}# の後ろに付けます。サーバーが受け取るのは暗号文の番号だけで、鍵は見えません。閲覧ページは受け手に公開され、先に登録する必要はありません。以下でこの境界を分解し、その場で照合する手順を書きます。

fragment はリクエストに入らない その場で照合できる 登録不要ですぐ使える
00 / 目次

まず照合する層を見る

本記事が答えるのは「# がサーバーログに入らない理由」だけです。ワンタイムリンクの操作手順ではなく、セキュリティの「平文はブラウザを離れるか」の総覧でもありません。

01 / 役割

# の後ろが果たす役割

秘密がアドレスバーに出ても、サーバーログにコピーがあるとは限りません。この判断はクエリパラメータにはだいたい当てはまり、fragment には当てはまりません。

運用担当が一時パスワードをチャットに入れたり、サポートが管理画面の URL を token ごと転送したりするとき、本当に怖いのは「相手が見える」ことより、「途中の各ホップに完全なリンクが残る」ことです。だから多くの人は、秘密がアドレスバーに出れば、サーバーログにも必ずコピーがあると決めつけます。

完全なアドレスは3つに割れます。プロトコルとホストは、ブラウザがどこへ接続するかを決めます。パスとクエスチョン以降のクエリパラメータは、どの資源かを決め、この2つは HTTP のリクエスト行に出ます。ハッシュ以降の文字を fragment と呼びます。もともとはページ上のアンカーへスクロールするためのもので、のちにフロントのスクリプトも location.hash で本機からこの文字列を読みます。サーバーは受け取れず、ルーティングや認証にも使うべきではありません。

鍵を # の後ろに置くのは、新しい暗号化アルゴリズムを発明したわけではありません。ブラウザが長く守ってきた送信境界を使うだけです。同じリンクに「サーバー向けの番号」と「現在のタブだけが持つ鍵」を同時に載せられます。UsePwd のワンタイムリンクが使うのも、この境界です。作成ページも閲覧ページも送り手も受け手も登録不要です。サーバーは暗号文だけを一時保管し、平文と鍵は既定でリクエスト本文として送りません。

02 / リクエスト

実際に送られるのはどの部分

s.html?id=abc123#the-key を見てください。ブラウザが送る GET のリクエスト行には、通常パスと id だけがあります。#the-key はリクエストになく、ログに残す対象もありません。

これは URL 規格が長くそうなっているのであり、あるサイトの私的な約束でも、「サーバーが見ないと言った」わけでもありません。表の「サーバーが見えるか」は、TLS 終端のあと、オリジンまたは自分で管理するリバースプロキシが、その HTTP リクエストから当該フィールドを読めるかを指します。本機が乗っ取られている、拡張がページを読める、相手がスクリーンショットを残す、といった話は含みません。

クエリパラメータ
?id=abc123&key=secret

リクエスト行に丸ごと出ます。一般的なアクセスログは、完全な URL を残しがちです。

URL fragment
#secret

ブラウザはリクエストの一部として扱いません。一般的なアクセスログに、この部分を残す対象はありません。

リクエスト本文
ciphertext

ワンタイムリンクの作成時に、実際にアップロードする部分です。UsePwd では暗号文、有効時間(時間)、閲覧回数だけです。

よくある誤解は「HTTPS を使っているから、ログには見えない」です。伝送の暗号化が守るのは、回線上の内容を中間者が平文で読めないことです。オリジンと自分で管理するリバースプロキシは、TLS 終端のあとでも、完全なリクエスト行を見られます。だから HTTPS は ?key= をアクセスログから消しません。fragment がログに入らないのは、そもそも送られていないからであり、回線が暗号化されているからではありません。

もうひとつ見落としやすい通路が Referer です。既定では、一部の遷移が「参照元ページの URL」を次の行き先へ付けます。現代のブラウザは HTTPS 同士の遷移で、既定ポリシーとして fragment を落とすことが多いです。一方、クエリパラメータは Referer に残ることがあります。一度限りの鍵を ?key= ではなく # の後ろに置く理由のひとつも、ここです。下流のすべてのサイトに、参照元を記録しないと約束させることはできません。

境界

fragment が HTTP に入らないことと、「リンク自体をコピーできない」ことは別です。アドレスバーの完全な文字列、つまり # 以降の鍵も含めて、本機の履歴、共有プレビュー、自分で送ったメッセージには出ます。本記事が説明するのはサーバーログの層だけであり、fragment を万能の金庫にはしません。

03 / 照合

ネットワークパネルを開けば見える

目標は「世界中の誰にも見えない」ことの証明ではなく、今回 UsePwd へ送った HTTP リクエストに、# 以降の鍵がないことを示すことです。

  1. 01
    ワンタイムリンクの作成ページを開く

    ワンタイムリンクへ進みます。ページは登録不要です。ログインは不要です。見分けられるが、本番の鍵ではない例文を入力してください。

  2. 02
    ネットワークパネルを開き、記録を消去する

    F12 または右クリックの検証で、ネットワーク(Network)へ切り替えます。必要なら既存のリクエストを消去し、初回読み込みと混ぜないようにします。

  3. 03
    リンクを1本作る

    送信後、ブラウザは先に現在のタブで AES-256-GCM 暗号化し、それから /api/secrets へリクエストを送ります。フィールドは ciphertextttl_hoursmax_reads です。生成される共有アドレスの形は s.html?id={id}#{key} です。

  4. 04
    作成リクエストを確認する

    その POST を開きます。リクエスト URL に # 以降の鍵は出てはいけません。リクエスト本文は暗号文と2つの数字であり、いま入力した例文ではありません。

  5. 05
    閲覧ページを開き、GET を照合する

    同じリンクで閲覧ページを開きます。続く GET や状態照会のパスには id だけがあります。アドレスバーの # 以降と、ネットワークパネルのリクエスト URL を並べて見てください。前者はローカルにあり、後者にはこの部分がありません。

本番環境では /tj/ へのアクセス分析もあることがあります。ペイロードはページ名とボタン名、たとえば「リンクを作成」であり、平文でも鍵でもファイル内容でもありません。本機プレビューでは分析を送りません。「鍵が HTTP に入ったか」だけを見るなら、先に /api/secrets で絞り込んでください。分析リクエストを暗号文の通路と取り違えないでください。

この手順はセキュリティの「平文はブラウザを離れるか」と補い合います。セキュリティは本機計算の範囲を答え、本記事は URL を分解して、ログに # 以降がない理由を説明します。どちらのページも、作成ページの操作フォームの代わりにはなりません。

04 / 使い方

番号はクエリパラメータ、鍵は fragment。サーバーが知るのは、暗号文が1件あること、読める回数、期限だけであり、何で解くかは知りません。

作成時、現在のタブは Web Crypto で乱数の鍵を作り、AES-256-GCM でテキストを暗号化し、暗号文をサーバーへ渡します。返ってきた番号は ?id= に書き、鍵は # の後ろにだけ付けます。

閲覧ページは受け手に公開されます。相手が s.html?id={id}#{key} を開くと、ブラウザは先に id でサーバーから暗号文を取るか状態を尋ね、本機に残った fragment の鍵で復号します。作成時に決めた回数に達すると、サーバーは暗号文を削除し、リンクは再読できません。受け手も登録は不要です。閲覧ページ自体は一時的な暗号文の場面であり、本サイトの収録入口にはしません。製品の能力を理解するなら、作成ページか本記事の照合手順へ戻ってください。

鍵を fragment に置くことで解けるのは、「サーバーログとリクエスト行」の層です。「完全なリンクを誰に送ったか」は解けません。チャット、メール、チケットシステムは、貼ったアドレス全体を保存します。完全なリンクを手にした人は、番号と鍵の両方を持ちます。ワンタイムリンクが制限するのは、サーバー側の暗号文の寿命と閲覧回数であり、受け手がスクリーンショットするか、転送するかではありません。

クエリパラメータ方式との違いは

一度限りのリンクのなかには、復号材料を ?k= と書くものがあります。実装は簡単ですが、開くたびに鍵がリクエスト行に入り、CDN、WAF、オリジンのアクセスログに残ります。fragment 方式はハッシュを1つ足すだけで、ホスティング側が URL を完全に記録しても、暗号文を解く半分が欠けます。代償として、受け手には完全なリンクをコピーするよう伝え、クエスチョンより前だけをコピーしないようにする必要があります。# 以降が欠けると、閲覧ページは暗号文だけを取れ、本機では解けません。

だから本記事は、ワンタイムリンクを「パスワードマネージャー」や「取り戻せる金庫」とは書きません。UsePwd にアカウントはなく、パスワード保管庫もなく、ユーザー単位でパスワードを取り戻すこともできません。リンクをなくす、fragment が切れる、回数が尽きる、いずれでもサーバーは平文を復元できません。位置づけは概要をご覧ください。

読み違えないでください

fragment の鍵を「信頼できるサーバーだけが復号できる」と理解しないでください。事実は逆です。サーバーにこの鍵はなく、代わりに復号することもできません。復号できるのは、完全なリンクを開いたどのブラウザタブです。信頼の境界は「誰がアドレス全体を持つか」であり、「どのサーバーがより信頼できるか」ではありません。

05 / 範囲

fragment が防げないこと

「サーバーログに入らない」を「絶対に安全」と読むと、同じように照合できる境界をいくつか落とします。先に列挙し、原理の記事を保証書にしないようにします。

本機の履歴とプレビュー 01 ブラウザは完全なアドレスを覚えることがあります。プレビュー用ボットは通常 # より前の URL だけを取りますが、人へ送ったメッセージには完全な鍵が残ります。
自分で貼り出したとき 02 チケット、スクリーンショット、会議室の投影に書けば、fragment も一緒に行きます。これは Referer とは別の話です。
本機が乗っ取られているとき 03 拡張が現在のページを読めるなら、どのウェブツールも代わりに保証できません。ネットワークパネルも、この層は証明しません。
回数が縛るのは暗号文だけ 04 相手が復号したあと、平文は相手のタブにあります。破棄が消すのはサーバー上の暗号文であり、クリップボードのコピーではありません。

ワンタイムリンクに向くのは、送信通路を信頼でき、見たら終わりの一度限りの受け渡しです。一時パスワード、一度限りの API Key、短時間の確認コードです。長期の金庫には向かず、高価値なマスター鍵の対面受け渡しの代わりにもなりません。

ファイルのバックアップは別の道です。1ファイル最大 5 GB のローカル暗号化・復号はファイル暗号化へ。AES-256-GCM は現在のタブで完了し、.lock / .enc を出力します。ファイルは既定でアップロードされません。それは「自分で暗号文ファイルを残す」ことであり、「鍵を URL に詰め込む」ことではありません。2つのツールを同じ保証に混ぜないでください。

06 / 選択

受け渡しで通路をどう選ぶ

短い秘密を別の人へ渡さねばならず、ホスティング側のアクセスログに、それを解ける材料を残したくないとき。どのサイトのスローガンが大きいかを先に聞かず、次の順で判断してください。

秘密の閲覧回数が限られ、双方がブラウザを開けるなら、ワンタイムリンクを使います。平文は本機で暗号化し、番号は ?id=、鍵は #、登録不要ですぐ使えます。作成後にネットワークパネルで一度照合し、POST 本文が暗号文であること、GET の URL に fragment がないことを確認してください。本当に必要なのが長期保存、複数端末の同期、復元なら、本サイトの範囲を超えています。専用のパスワードマネージャーを使い、UsePwd をアカウントシステムと捉えないでください。

秘密を第三者のページに載せるべきでないなら、リンクを作らないでください。対面で口頭、オフライン媒体、または双方がすでに持つエンドツーエンドの通路だけです。fragment 方式が減らすのは「サーバーログ上の鍵」であり、「画面を見られるすべての人」ではありません。この2層を分けられてはじめて、URL の原理記事を製品保証として読まずに済みます。

パスワード自体の強さは、また別の話です。6–128 桁の乱数パスワードはパスワード生成で。本機で強度を見つつ、ページ同梱の弱いパスワードの公開リストと照合するならパスワード強度チェックです。診断はネット全体の漏洩照会ではなく、検査するパスワードはアップロードされません。リンクやチケット本文を外部へ出す前は、URLクリーナーで追跡パラメータを除くかマスキングしてください。これらのページも本記事と同じく登録不要です。上部バー右側は言語切替だけです。

07 / 次の一歩

読んだらその場で照合する

記事が答えるのは「ログに # 以降がない理由」です。破棄できる暗号化リンクを作るなら、ワンタイムリンクを開けばよく、先に登録する必要はありません。