セミコロン (;) の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ベースのコードエディタやスタイルプレビューツールなど。

Try It — URL Encoder

フルツールを開く