セミコロン (;) のURLエンコード
セミコロン (;) を%3BにURLエンコードする方法を解説。パラメータ区切りとしての歴史的な役割と、現代のエンコード要件を理解しましょう。
Character
;
Encoded
%3B
詳細な説明
セミコロン(;)はURLにおいて、歴史的にパスセグメント内の代替パラメータ区切り文字として機能していた予約文字です。この用途は現在ではあまり使われていませんが、セミコロンがURL内にリテラルデータとして現れる場合は%3Bにエンコードする必要があります。
percent-encoding形式: %3Bはセミコロンを表します(ASCIIコード59、16進数で0x3B)。
歴史的背景: RFC 3986は;をサブデリミタに指定しており、URL内でスキーム固有またはアプリケーション固有の用途に予約されています。最も注目すべき歴史的な使用法はマトリックスパラメータ(パスパラメータとも呼ばれる)で、パスセグメント内のキーバリューペアをセミコロンで区切っていました:/products;color=red;size=large。SpringやJAX-RSのようなJavaベースのフレームワークはこの構文を今でもサポートしていますが、モダンなWeb開発では広く使われていません。
JavaScriptでの動作:
encodeURIComponent(";") // "%3B"
encodeURIComponent("a=1;b=2;c=3") // "a%3D1%3Bb%3D2%3Bc%3D3"
encodeURI("/path;param=value") // "/path;param=value" (; を保持)
現在エンコードが重要な理由:
- 一部のWebアプリケーションファイアウォール(WAF)はセミコロンを特別に扱い、リクエストをブロックまたは修正する可能性がある
- 特定のサーバーフレームワークがセミコロンをパラメータ区切りとして解析し、予期しない動作を引き起こす可能性がある
- 2021年、セミコロンによるクリティカルなCookie解析の脆弱性(セミコロンを介したHPP)が複数のフレームワークに影響を与えた。一部のフレームワークは
;をCookie区切りとして扱い、他は扱わなかったため - セミコロンを含むURLは、メールやチャットアプリケーション、特定のリンクパーサーで切り詰められたり誤処理されたりする可能性がある
よくあるシナリオ:
- CSSプロパティ文字列の受け渡し:
?style=color%3A%20red%3B%20font-size%3A%2014px - URLパラメータ内のSQL風の式の埋め込み
- セミコロンを区切りとして選択したリストの受け渡し
- URLパラメータ内のJavaScriptコードスニペット(教育ツール、プレイグラウンド)
落とし穴: アプリケーションがJavaベースのプロキシやサーバー(Apache Tomcatなど)の背後にある場合、アプリケーションがマトリックスパラメータを使用していなくても、URLパス内のセミコロンが削除・再解釈される可能性があることに注意してください。これによりURLパスが暗黙的に切り詰められる可能性があります。Javaベースのコンポーネントを含むインフラの場合は、パス内のセミコロンをエンコードしてください。
ユースケース
CSSスタイル文字列やセミコロン区切りの設定値をURLパラメータで渡す場合。Webベースのコードエディタやスタイルプレビューツールなど。