web-dev-qa-db-ja.com

URLクエリ区切り文字としてのセミコロン

Webサーバーが(アンパサンドに加えて)URLクエリアイテムの区切り文字としてセミコロンをサポートすることを強くお勧めしますが( W3Cソース 、経由で Wikipedia )、一般的に従うこと。

たとえば、比較

http://www.google.com/search?q=nemooe = utf-8

http://www.google.com/search?q=nemo;oe = utf-8

結果。 (後者の場合、セミコロンはまたはこのテキストを書いた時点で、URLが次のように通常の文字列文字として扱われます:- http://www.google.com/search?q=nemo%3Boe = utf-8

私が試した最初のURL解析ライブラリですが、うまく動作します:

>>> from urlparse import urlparse, query_qs
>>> url = 'http://www.google.com/search?q=nemo;oe=utf-8'
>>> parse_qs(urlparse(url).query)
{'q': ['nemo'], 'oe': ['utf-8']}

セミコロンをセパレータとして受け入れる現在の状況は何ですか?また、潜在的な問題や興味深いメモは何ですか? (サーバーとクライアントの両方の観点から)

51
mykhal

1999年のW3C勧告 は廃止されました。 2014 W3C勧告 によると、現在のステータスは、パラメーターセパレーターとしてセミコロンがillegalになっていることです。

Application/x-www-form-urlencodedペイロードをデコードするには、次のアルゴリズムを使用する必要があります。 [...]このアルゴリズムの出力は、名前と値のペアのソートされたリストです。 [...]

  1. 文字列は、U + 0026 AMPERSAND文字(&)で文字列ペイロードを厳密に分割した結果とします。

つまり、?foo=bar;bazは、パラメーターfooの値がbar;bazになることを意味します。一方、?foo=bar;baz=snafoobar;baz=snaになるはずです(ただし、2番目の=%3Dにエスケープする必要があるため、技術的には違法です)。

19
geira

HTTPサーバーとサーバー側アプリケーションがセミコロンを区切り文字として受け入れている限り、準備は万端です。欠点はありません。あなたが言ったように、 W3C仕様はあなたの側にあります

HTTPサーバーの実装者、特にCGIの実装者が「;」の使用をサポートすることをお勧めします。 「&」の代わりに、この方法で「&」文字をエスケープする手間を作成者に保存します。

17
Daniel Vassallo

ボブ・アマンに同意します。 W3C仕様は、フォームGETリクエストのように見えるURL(例:http://www.Host.com/?x=1&y=2)でアンカーハイパーリンクを簡単に使用できるように設計されています。このコンテキストでは、アンパサンドは、アンパサンド(たとえば、")で始まる文字エンティティ参照のシステムと競合します。したがって、W3Cは、これらのURLを記述しやすくするために、Webサーバーでアンパサンドの代わりにセミコロンをフィールド区切り文字として使用できるようにすることをお勧めします。ただし、この解決策では、Webブラウザーがフォームを送信するときにURLでアンパサンドを普遍的に使用している場合でも、作家はアンパサンドを何かに置き換える必要があり、;が等しく有効なフィールド区切り文字であることを覚えている必要があります。これらのリンクでアンパサンドを&に置き換えることを覚えておくのは、ドキュメントの他の場所で行われるのと同じように、間違いなく難しいです。

さらに悪いことに、すべてのWebサーバーがフィールド区切り文字としてセミコロンを許可するまで、URLライターは一部のホストに対してのみこのショートカットを使用でき、他のホストには&を使用する必要があります。また、特定のホストがセミコロン区切り文字の許可を停止した場合、後でコードを変更する必要があります。これは、すべてのサーバーで永久に機能する&を使用するよりも確かに困難です。これにより、Webサーバーがフィールドセパレーターとしてセミコロンを許可するインセンティブが削除されます。誰もが既にアンパサンドを&ではなく;に変更しているのに、なぜわざわざですか

5
Matthias Fripp

要するに、HTMLは(その寛容さのために)大きな混乱であり、セミコロンを使用すると、これがLOTを単純化するのに役立ちます。私が見つけた複雑さを考慮すると、セパレータとしてアンパサンドを使用すると、代わりにセパレータにセミコロンを使用するよりもプロセス全体が約3倍複雑になると推定します!

私は.NETプログラマーであり、私の知る限り、.NETはnot本質的に ';'を許可します区切り記号として、アンパーサンドを区切り記号として使用する既に問題のあるシステムではなく、セミコロンを使用することで大きな価値を見たため、独自の解析および処理メソッドを作成しました。残念ながら、非常に立派な人々(別の回答の@Bob Amanなど)は、セミコロンの使用がアンパサンドを使用するよりもはるかに優れており、非常に単純である理由に価値がありません。そこで、セミコロンを使用する価値をまだ認識していない他の立派な開発者を説得するために、いくつかのポイントを共有します。

HTMLページで '?a = 1&b = 2'のようなクエリ文字列を使用することは不適切です(最初にHTMLエンコードせずに)が、ほとんどの場合は機能します。ただし、これはほとんどのブラウザが耐性があるためであり、たとえば、適切なエンコーディングなしでキー値ペアの値がHTMLページURLに投稿されると、その耐性が見つけにくいバグにつながる可能性があります(直接 '? HTMLソースではa = 1&b = 2 ')。 '?who = me +&+ you'のようなQueryStringも問題があります。

私たちの人々はbiasesを持つことができ、一日中バイアスに反対することができるので、バイアスを認識することは非常に重要です。たとえば、「;」で区切ると考えることに同意します「きれい」に見えます。私の「よりクリーンな」意見は純粋にバイアスであることに同意します。そして、別の開発者は、等しく反対で等しく有効なバイアスを持つことができます。したがって、この1つの点に対する私のバイアスは、反対のバイアスよりも正確ではありません。

しかし、セミコロンの偏りのないサポートにより、長期的にはすべての人の生活が楽になるため、全体像を考慮したときに正しく議論することはできません。要するに、セミコロンを使用すると、everyoneでの生活がより簡単になりますが、1つの例外があります。新しいことに慣れるという小さなハードルです。それで全部です。何かを変更することは常に困難です。しかし、変更を続けることの難しさは、&を使い続けるという継続する難しさに比べて見劣りがします。

;を使用してQueryStringセパレーターとして、非常に簡単になります。アンパサンドセパレータは、セミコロンが使用された場合よりも2倍以上困難です適切にコーディングするため。 (私は思う)ほとんどの実装は適切にコーディングされていないので、ほとんどの実装はそれほど複雑ではありません。しかし、バグを追跡して修正すると、生産性が失われます。ここでは、&がセパレーターである場合にQueryStringを適切にエンコードするために必要な2つの別個のエンコード手順を示します。

  • ステップ1:クエリ文字列のキーと値の両方をURLエンコードします。
  • ステップ2:ステップ1でURLエンコードされた後、「a = 1&b = 2」などのキーと値を連結します。
  • ステップ3:次に、ページのHTMLソースのQueryString全体をHTMLエンコードします。

したがって、適切な(バグのない)URLエンコードのために特別なエンコードを2回行う必要があります。それだけでなく、エンコードは2つの異なる異なるエンコードタイプです。最初はURLエンコードで、2番目はHTMLエンコード(HTMLソースコード用)です。これらのいずれかが間違っている場合、バグを見つけることができます。ただし、手順3はXMLでは異なります。 XMLの場合、代わりにXML文字エンティティエンコーディングが必要です(ほぼ同じです)。私のポイントは、最後のエンコードは、URLのコンテキストに依存しているということです。それがHTML Webページにあるか、XMLドキュメントにあるかは関係ありません。

はるかに単純なセミコロンセパレータを使用したプロセスは、予想どおりです。

  • 1:キーと値をURLエンコードし、
  • 2:値を連結します。 (ステップ3のエンコードなし)

ほとんどのWeb開発者はブラウザーが非常に寛容であるため、ステップ3をスキップすると思います。しかし、これはバグを見つけたり、それらのバグが存在しないとユーザーが物事を実行できなかったり、バグレポートを書いたりすると、バグやより複雑な問題につながります。

実際に使用されるもう1つの問題は、C#とVB.NETの両方でソースコードにXMLドキュメントマークアップを記述するときです。 &をエンコードする必要があるため、文字通り、私の生産性に大きな影響を及ぼします。余分なステップ3により、ソースコードも読みにくくなります。したがって、この読みにくい赤字は、HTMLとXMLだけでなく、C#やVB.NETコードなどの他のアプリケーションにも当てはまります。これらのドキュメントではXMLドキュメントが使用されているためです。したがって、ステップ3のエンコードの複雑さは他のアプリケーションにも拡大します。

要約すると、;を使用してセミコロンを使用する場合の(正しい)プロセスは、プロセスが通常どのように予期されるかであるため、セパレーターは単純です。エンコードの1つのステップのみを実行する必要があります。

おそらくこれはあまりにも混乱していなかったでしょう。しかし、混乱や困難はすべて、HTMLエンコードされた分離文字を使用しているためです。したがって、「&」が犯人です。そして、セミコロンはその複雑さをすべて軽減します。

(上記の3つのステップと2つのステップのプロセスは、通常ほとんどアプリケーションの場合に必要なステップ数です。ただし、完全に堅牢なコードでは、3つのステップすべてがただし、私の経験では、most実装は粗雑で堅牢ではありません。したがって、クエリ文字列のセパレータとしてセミコロンを使用すると、Webサイトや相互運用性のバグが少ない多くの人が楽になります。全員がアンパサンドではなくセミコロンをデフォルトとして採用した場合)

2
Shawn Kovac