Opensourcetechブログ

OpensourcetechによるNGINX/Kubernetes/Zabbix/Neo4j/Linuxなどオープンソース技術に関するブログです。

Percent-encoding (パーセントエンコーディング)について

 

こんにちは、LinuCエバンジェリストこと、鯨井貴博@opensourcetechです。

 

nginx unitの新しいバージョン(1.18.0)がリリースされたのですが、

以下の更新がされており「パーセントエンコーディング???」となったので、調べてみました。

Feature: support for percent-encoding in the "uri" and "arguments" matching options and in the "pass" option.

(機能追加:"uri"と"arguments"の一致オプションおよび"pass"オプションでのパーセントエンコードのサポート。)

nginx unit-1.18.0 released. - Opensourcetechブログ

 

 

Percent-encodingとは

以下のリンクによると、「URL のコンテキストで特定の意味を持つ 8 ビット文字をエンコードするメカニズムです。URL エンコードとも呼ばれます。」

Percent-encoding (パーセントエンコーディング) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN

 

「#」とか「?」とかの文字を、%**(**には16進数が入る)というように変換するメカニズムとのことです。

 

RFC3986の「Section 2.1」にも載っています。

RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax

f:id:opensourcetech:20200529135659p:plain

 

パーセントエンコーディングメカニズムは、そのオクテットの対応する文字が許可されたセットの外にあるか、またはコンポーネントの区切り文字またはコンポーネント内で使用されている場合に、コンポーネント内のデータオクテットを表すために使用されます。
パーセントエンコーディングされたオクテットは文字トリプレットとして符号化され、パーセント文字「%」の後にそのオクテットの数値を表す2桁の16進数が続く。
たとえば、"%20"はバイナリオクテット"00100000"(ABNF: %x20)のパーセントエンコーディングで、US-ASCIIではスペース文字(SP)に対応します。
セクション2.4では、いつパーセントエンコーディング(符号化)およびデコーディング(復号化)が適用されるかを説明する。

pct-encoded="%"HEXDIG HEXDIG

大文字の16進数「A」から「F」は、それぞれ小文字の「a」から「f」に相当します。
2つのURIが、パーセントエンコーディングオクテットで使用される16進数の場合のみ異なる場合、それらは等価である。
一貫性を保つために、URIの生成元と正規化元は、すべてのパーセントエンコーディングに大文字の16進数を使用する必要があります。

 

 

Percent-encodingの変換を確認

 nkf(ネットワーク用漢字コード変換フィルタ)コマンドを使って試してみます。

太字にしたオプションを使います。

nkf(1) nkf(1)

NAME
nkf - ネットワーク用漢字コード変換フィルタ

SYNOPSIS
nkf [-butjnesliohrTVvwWJESZxXFfmMBOcdILg] [file ...]

DESCRIPTION
nkf
はネットワークでメールやニュースの読み書きをするために作られた、漢字コードの変換フィルタである。

このnkfの特徴としては、入力漢字コード系の統計的な自動認識機能がある。
このため、利用者は、入力漢字コード系が何であるかを知らなくても、出力漢字コード系のみ指定すれば良いことになる。
ただ、この判定機構は、理論的には完全ではないが、通常のニュースやメールのメッセージについては確実に動作する安全なものにはなっている。

現在、nkfが認識できる入力の漢字コード系は、いわゆる JIS コード (ISO-2022-JP
に基づくもの)、Shift_JIS (MS 漢字コード)、 日本語 EUC (AT&T コード)、UTF-8、UTF-16
のいずれかである。 出力する漢字コード系も、これらである。
入力は、ファイルを指定しなければ、標準入力となる。 出力は標準出力である。

-w -w8[0] -w16[BL][0] Unicode を出力する。
-w -w80 UTF8 コードを出力する。 (BOM 無し)
-w8 UTF8 コードを出力する。
-w16 -w16B0 UTF16 コードを出力する。 (Big Endian / BOM 無し)
-w16B UTF16 コードを出力する。 (Big Endian / BOM 有り)
-w16L UTF16 コードを出力する。 (Little Endian / BOM 有り)
-w16L0 UTF16 コードを出力する。 (Little Endian / BOM 無し)

-M[BQ]
MIME に変換する。
-M ヘッダ形式に変換する
-MB base64 stream に変換する
-MQ Quoted stream に変換する

-J -E -S -W
期待される入力コードの性質を指定する。
-J ISO-2022-JP を仮定する。
-E 日本語 EUC (AT&T) を仮定する。
-S Shift_JIS を仮定する。 いわゆる半角カナ (JIS X 0201 片仮名) も受け入れる。
-W UTF-8 を仮定する。
-W8 UTF-8 を仮定する。
-W16 UTF-16 (Little Endian)を仮定する。
-W16B UTF-16 (Big Endian)を仮定する。
-W16L UTF-16 (Little Endian)を仮定する。

--cap-input, --url-input
それぞれ :、% に続く 16 進数を文字に変換する

 

 \(バックスラッシュ)や'(シングルクォーテーション)で各文字を符号化。

[root@db01 ~]# echo \:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\%' ' | nkf -WwMQ | tr = %
%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%25%20

 

%**となっているエンコードから復号化。

[root@db01 ~]# echo %3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%25%20 | nkf -w --url-input
:/?#[]@!$&'()*+,;=%

 

 

 

 

 

アフィリエイトのアクセストレード

 

 

 

 

 

 

www.slideshare.net

github.com

www.facebook.com

twitter.com

www.instagram.com

 

 

にほんブログ村 IT技術ブログ Linuxへ
Linux

にほんブログ村 IT技術ブログ オープンソースへ
オープンソース

 

 

Opensourcetech by Takahiro Kujirai