ブログ • 共有の仕組み
URL Hash を使用して JSON を共有します: サーバーにアップロードしない場合の原則、制限、および使用方法
同僚は「フォーマットしたらすぐにあなたの側JSONは正しいですが、ここでエラーを報告します。」と言いました。ファイルをやり取りするのは面倒ですし、スクリーンショットはもう変更できません。
URL Hash シェアする現在のツールを書き込み、アドレスバーに入力します#後で。相手が同じリンクを開くと、ブラウザは左右の列をローカルに復元します。通常のページリクエストでは、このデータはサーバーに送信されません。
これは、「オンラインの書式設定 Web サイトに投稿して [共有] をクリックする」ことと同じではありません。後者は通常、最初に元のテキストを他の人のバックエンドに POST し、次に短いリンクを提供します。 Hash 共有にはそのような手順はありません。
この記事では次のことについて説明します。
- URL Hash 通常サーバーログに表示されないのはなぜですか?
- DevBox 件中
#tool=…&data=…コーディング方法 - Base64 が暗号化されない理由
- リンクはどのくらい拡張されますか?どのソフトウェアがリンクを切り詰めますか?
- いつ共有を使用し、いつ共有を停止する必要がありますか?
まずこれを思い出してください:Hash は、ブラウザがデフォルトで使用しないため機能します。#後でサーバーに送信します。しかし、これは暗号化ではなく、チャット ソフトウェアによるリンクの切断を防ぐこともできません。この問題を「原理→エンコーディング→長さ→境界」に従って分解してみましょう。
URL Hash 共有とは何ですか?
完全な URL は 2 つの部分に分けることができます。サーバーに表示される部分と、ブラウザー内にのみ残る部分です。
サーバーへのリクエスト フラグメント / Hash (ブラウザのみに残す)
DevBox の「共有」の機能は次のとおりです: 現在のツール ID と Hash への左入力をエンコードし、段落全体をエンコードします。location.hrefクリップボードにコピーします。相手が開いた後、ページのスクリプトは次のようになります。location.hash、存在する彼自身のブラウザツールとテキストを復元します。
-
1
ブラウザで「共有」をクリックすると
入力は最初に UTF-8 に変換され、次に Base64 にコンパイルされ、次のように書き込まれます。
#tool=&data=。 -
2
完全な URL を同僚に送信します
相手が同じサイトを開いた後、ページのスクリプトは次のようになります。
location.hash。 -
3
相手のブラウザで復元する
ローカルフォーマット、チェックサム、または Diff。サーバーはページ自体を受信するだけで、この JSON は受信しません。
これとブラウザにJSON処理を入れるこれも同じ原理です。計算はローカルで行われ、共有はデータベースを経由しません。プライバシーの境界は次のように書かれていますプライバシーに関する声明セクション 3。
Hash がサーバーにアップロードされない理由
フラグメントが HTTP リクエストに入りません
によるとMDN による URL.hash の説明そしてWHATWG URL 標準のフラグメント、#その後にフラグメント識別子が続きます。ブラウザが移動するとき、HTTP リクエストのパス/クエリにはこの段落は含まれません。
したがって、アクセス ログには通常、次のもののみが含まれます。
GET /json/format.html HTTP/1.1
の代わりに:
GET /json/format.html#data=……
このため、Hash は「サイトにペーストのコピーを保存したくない」場合に適していますが、不適切安全なチャネルの場合、データは URL にそのまま残っており、デフォルトではネットワークのこのホップを通過しません。
クエリ文字列とクエリ文字列の違い
| 書き方 | 例 | サーバーはそれを見ることができません | やるべきことに適した |
|---|---|---|---|
| Query | ?tool=json-format&data=… |
ミーティング。リクエスト行、リバース プロキシ、CDN ログに表示されます。 | サーバーが読み取る必要があるパラメータ |
| Hash | #tool=json-format&data=… |
通常のページリクエストでは、 | フロントエンドスクリプトのみのステータス |
誰かが同じ Base64 を入れた場合?その後、結果は同じように見えますが、データはサーバー ログに入力されています。 DevBox この層を避けるために、Hash のみを書き込みます。
さらに、リファラーは通常、フラグメントを保持しません。共有ページから外部リンクをクリックすると、通常、他のサイトはHashのJSONを取得できません。これはブラウザのデフォルトの動作であり、追加の暗号化を行うものではありません。
DevBox の共有リンクはどのようなものですか?
「共有」をクリックすると、HashがグループになりますURLSearchParams:
#tool=json-format&data=<Base64>
tool
現在のツール ID。リンクを開いた後、常に「JSON 形式」に陥るのではなく、対応するワークスペースに切り替わります。一般的な値には次のものがありますjson-format、json-validate、json5、json-path、json-diff。
ツールを切り替えるだけで共有をクリックしない場合、アドレス バーは次のように更新されます。#tool=…、データは含まれていません。これは、使用しているツールを記憶し、エディターの内容を履歴に書き込まないようにするためです。
data
左側にUTF-8のテキストを入力し、Base64を実行します。実装的には以下と同等です。
btoa(unescape(encodeURIComponent(input)))
初めencodeURIComponent中国語と絵文字を使えるようにするためですbtoa。復元するときは逆の道を進みます。これについては MDN と協議中ですUnicode文字列のBase64エンコードそれと同じ種類の問題です。
エンコーディングは暗号化ではありません
Base64 の目的は、「どんなバイトでも URL に入れることができる」ことであり、「信頼できる人だけがそれを読み取れる」ということではありません。リンクを取得した人は誰でもコンソールでリンクを復元できます。
const data = new URLSearchParams(location.hash.slice(1)).get("data");
decodeURIComponent(escape(atob(data)));
置くこともできますdata=次の文字列がこのサイトにスローされますBase64 デコード中。パスワード、ワンタイムリンク、有効期限はありません。
完全な例
「JSON形式」で入力するとします。
{
"name": "Ada",
"role": "dev"
}
1 行に圧縮すると 27 バイトになります。
{"name":"Ada","role":"dev"}
UTF-8 → Base64 は 36 個の ASCII 文字を取得します (+ / /、URL) に配置された場合、パーセント記号エンコーディングによって引き伸ばされることはなくなります。
eyJuYW1lIjoiQWRhIiwicm9sZSI6ImRldiJ9
Hash を完了:
#tool=json-format&data=eyJuYW1lIjoiQWRhIiwicm9sZSI6ImRldiJ9
相手がそれを開いて同じ段落 JSON を見た後、フォーマットを続けて実行できます。JSONPath 抽出、または独自の応答で Diff を実行してください。元のテキストが実際に注釈付きの設定である場合は、代わりにそれを使用する必要があります。JSON5 分析出力を利用できないままにするのではなく、再度共有します。JSON.parseテキストは直接相手に投げられます。
漢字が含まれているとボリュームがより顕著になります。例えば{"msg":"格式化后两边一致"}34 バイトの UTF-8、Base64 に 48 文字が続きます。どこ/そして=URL エンコード後のパラメータ値は 54 文字になります。
リンクの長さはどれくらいになりますか?
Hash 共有のハード制限は「サーバーのアップロード制限」ではありません。段落 URL 全体を相手のブラウザに送信できますか?。
ほぼ純粋な ASCII である JSON のセクションの場合、測定された大きさのオーダーは次のとおりです (tool=json-format&data=拡張後の長さ):
| 原文約 | エンコード後 Hash 約 | 経験の制限 |
|---|---|---|
| 200 B | 330文字 | チャット ソフトウェアはほとんどの場合、完全に提供できます |
| 1 KB | 1.4 KB | ほとんどの IM は問題ありませんが、それでもクリックして確認することをお勧めします。 |
| 8 KB | 11 KB | 通常はブラウザで開くことができます。一部のクライアントでは切り捨てられる場合があります。 |
| 32 KB | 44 KB | WeChat/電子メールの元のテキスト転送が引き続き機能するとは期待しないでください |
Chrome は非常に長いアドレス バーを消化できますが、間には IM、電子メール、ショート リンク サービス、QR コードなどの別のレイヤーがあります。それぞれの帽子は短く、「尻尾を切りました」ということはめったにありません。したがって、プロセスは次のようになります。
-
1
「共有」をクリックします
単にコピーするのではなく、完全なアドレスをコピーしてください
#少し後ろです。 -
2
まずこのマシンの新しいタブで開きます
同僚に送信する前に、ツールと入力がそこにあることを確認してください。
アクセスログ全体と数メガバイトのエクスポートファイルについては、ローカルに貼り付けるか、「ダウンロード」をクリックしてください。 Hash 共有の目的は「短時間の入力を再現する」ことであり、ネットワークディスクとしてではありません。
Hash 共有と他の方法の違いは何ですか?
| 方法 | データはどこに行くのでしょうか? | 相手はどうすれば継続できるでしょうか? | 適切な | 不適切 |
|---|---|---|---|---|
| URL Hash | 両方のアドレスバーで停止します | 作業を続けるには同じサイトを開いてください | 小さな段落 JSON、繰り返し発生するエラー | キー、非常に大きなファイル |
| 元のチャットテキスト | チャットサーバー | もう一度コピーしてください | 数行の設定 | 永続セッションに記録された内部データ |
| スクリーンショット | 写真 | 表示のみ可能ですが解析はできません | 構造について話す | まだフォーマットを続ける必要があります / Diff |
| 付属品/ネットワークディスク | サードパーティのストレージ | ダウンロード後に投稿する | 大きなファイル | もうコピーを避けたい |
| オンラインペースト | 他の人のバックエンド | 短いリンクを開く | 公共の長期保管が必要 | このマシンから離れてはいけないもの |
チームがすでにイントラネットの貼り付けまたは作業指示の添付ファイルを持っている場合は、ログの大部分に元のチャネルを使用する方が安定しています。 Hash の値は次のとおりです。同じリンクには、「どのツールを使用するか」と「入力内容」の両方が含まれています。, 相手は、あなたがフォーマットをクリックしたのか検証をクリックしたのかを推測する必要はありません。
使用時に覚えておくべき境界線
- リンクは平文と同等です。ページを開けば誰でもコンテンツを復元できます。秘密鍵、実稼働トークン、顧客リスト、または非公開のインターフェースを共有しないでください。
- 送信する前にクリックしてください。チャット ソフトウェアが長すぎる URL を切り詰めると、相手は不完全な Hash を開き、空の入力またはデコードの失敗として表示されます。
- 相手も同じDevBoxサイトを開くことができる必要があります。Hash はページとは別に解析できません。
#最後の段落をメモ帳に放り込んでも無駄です。 - ブラウザの履歴には完全なアドレスが残ります。ローカル履歴、同期されたアカウント、画面共有をすべて確認できます。共有をクリックせずにツールを切り替えるだけの場合、Hash にはデータはなく、コピーを 1 つ保存するだけです。
- 拡張機能とデバッグ ツールは次のように読み取る可能性があります。
location.href。ローカル コンピューティングにより、「このコンピュータ上の誰もコピーが見られなくなる」のではなく、「サイトがコピーを保存する」というリスクが軽減されます。 - 「URLから引く」も一つの方法です。ワークスペースにリモート アドレスを入力して [プル] をクリックすると、ブラウザはそのアドレスにリクエストを送信します。シェアHash ご持参いただくと
url=、それを開いた人もこのリクエストを開始します。自分自身で確認した情報源のみを信頼してください。
本当のプライバシーに関しては、オフライン ツールまたはイントラネット ツールを使用してください。これは「サイトにログインボックスがあるかどうか」とは関係ありません。
よくある質問
URL Hash 共有とは何ですか?
現在のツールをエンコードしてアドレスバーに入力します#後で。相手が同じサイト上の同じリンクを開いた場合、ブラウザはこのデータをページ リクエストとしてサーバーに送信せずに、コンテンツをローカルに復元します。
Hashのデータサーバーは見えますか?
通常のページリクエストではフラグメントはサーバーに送信されず、アクセスログには通常パスのみが記録されます。しかし、それは秘密であるという意味ではありません。完全なリンクを持っている人は誰でもそれを解読できます。
エンコードと暗号化の違いは何ですか?
エンコード (ここでは Base64) により、テキストを URL に入れることができ、誰でもそれを元に戻すことができます。暗号化にはキーが必要で、キーがないとキーを読み取ることができません。 DevBox 共有は前者を行います。
Hash 共有はキーまたはトークンに使用できますか?
できません。リンクは一度送信すると取り消すことはできず、履歴に記録されます。キーのチームのキー管理システムを入力してください。Web アドレス バーには入力しないでください。
相手は白紙で開けますか?
まず、URL があるかどうかを確認してくださいdata=真ん中が切り取られています。単なるコピーではなく、同じ DevBox サイトを開いていることをもう一度確認してください。#少し後ろです。代わりにこのマシンを使用して、特大のテキストを貼り付けてください。
JSON フォーマットと検証との関係は何ですか?
共有は「現在のインプットやツールをそのまま持ち帰る」ことだけを担います。書式設定、構文検証、JSON5、JSONPath、Diff は、相手のブラウザでローカルに実行されます。最初に構造を確認する必要があります。使用してくださいJSON フォーマット;位置決めが必要ですUnexpected token、使用チェックまたはJSON5。
要約する
URL Hash 共有とは基本的に次のとおりです。
ローカル ツールのステータス + 可逆エンコード + ブラウザー フラグメントはリクエストとともにアップロードされません。
JSON の短いセクションや構成を再生するのに適しています。ネットワーク ディスクとしての使用には適しておらず、機密情報の送信にも適していません。これを正しく使用すると、あなたと同僚は同じ左右の列に向かって話していることになります。使い方を間違えると、誰でも開けるアドレスにプレーンテキストを貼り付けるのと同じことになります。