web-dev-qa-db-ja.com

コロン `:`はフレンドリーURLの使用に安全ですか?

アプリケーションセクションをスラッシュで区切られた単語として指定するURLシステムを設計しています。具体的には、これはGWTにあるため、URLの関連部分はハッシュに含まれます(クライアント側のコントローラーレイヤーによって解釈されます)。

http://site/gwturl#section1/section2

一部のセクションには、:で指定する追加の属性が必要な場合があります。これにより、URLのセクション部分が明確になります。次のように、コードは最初に/で、次に:で分割されます。

http://site/gwturl#user:45/comments

もちろん、これはurl-friendlynessのために行っているので、特別な意味を保持するこれらの文字がブラウザや他のシステムによってurl-encodeされず、最終的にこの:

http://site/gwturl#user%3A45/comments <--- BAD

このようにコロンを使用しています 安全 (つまり、自動的にエンコードされないことを意味します)ブラウザー、ブックマークシステム、JavascriptまたはJava code?

100
Nicole

私は最近 wrote URLエンコーダーなので、これはかなり新鮮です。

http://site/gwturl#user:45/comments

フラグメント部分user:45/comments)は、 RFC 3986 URIに対して完全に合法です。

[〜#〜] abnf [〜#〜] の関連部分:

fragment      = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

これらの制限は別として、フラグメント部分には、アプリケーションが提供するもの以外の定義された構造はありません。 スキームであるhttpは、この部分をサーバーに送信しないことのみを示しています。


編集:

D'oh!

URI仕様についての私の主張にもかかわらず、 irreputable彼が指摘 thatHTML 4仕様が要素名/識別子を制限する場合に正しい答えを提供します

識別子ルールは HTML 5で変更 であることに注意してください。 URI制限は引き続き適用されます(執筆時点では、HTML 5によるURIの使用に関して未解決の問題がいくつかあります)。

74
McDowell

URI標準に関するMcDowellの分析に加えて、フラグメントは有効なHTMLアンカー名でなければならないことも忘れないでください。 http://www.w3.org/TR/html4/types.html#type-name

IDおよびNAMEトークンは文字([A-Za-z])で始まる必要があり、その後に任意の数の文字、数字([0-9])、ハイフン( "-")、アンダースコア( "_")を続けることができます、コロン( ":")、およびピリオド( "。")。

あなたは幸運です。 「:」は明示的に許可されています。そして、「%」が違法な文字であるだけでなく、フラグメントがアンカー名と文字ごとに一致するため、誰も「%」エスケープする必要がありません。したがって、エージェントはとにかくそれらを抑えようとしません。

ただし、テストする必要があります。ウェブ標準は厳密には守られていません。時には標準が矛盾しています。たとえば、HTTP/1.1 RFC 2616では、リクエストURLでクエリ文字列を使用できませんが、HTMLでは、GETメソッドでフォームを送信するときにクエリ文字列を作成します。現実の世界で実装されたものは、結局のところ勝ちます。

56
irreputable

MediaWikiや他のWikiエンジンは、URLにコロンを使用して名前空間を指定しますが、明らかに大きな問題はありません。

http://en.wikipedia.org/wiki/Template:Welcome

54
Paul Wray

私はそれに頼りません。多くのユーザーエージェントによって%3AとしてURLエンコードされる可能性があります。

7
Asaph

URLEncoder javadocから:

HTMLフォームエンコーディングの詳細については、HTML specification を参照してください。

文字列をエンコードする場合、次の規則が適用されます。

  • 英数字「a」から「z」、「A」から「Z」、および「0」から「9」は同じままです。
  • 特殊文字「。」、「-」、「*」、および「_」は同じままです。
  • スペース文字「」はプラス記号「+」に変換されます。
  • 他のすべての文字は安全ではなく、最初に何らかのエンコーディングスキームを使用して1つ以上のバイトに変換されます。次に、各バイトは3文字の文字列「%xy」で表されます。xyはバイトの2桁の16進数表現です。使用する推奨エンコードスキームはUTF-8です。ただし、互換性の理由から、エンコーディングが指定されていない場合、プラットフォームのデフォルトのエンコーディングが使用されます。

あれは、 :は安全ではありません。

4
axtavt

FirefoxやIE8が文字を含むWikipedia RLs の一部をエンコードしていません。

3
kprobst

プロトコルで認証が必要な場合、コロンはユーザー名とパスワードの分割として使用されます。

3
JP Silvashy

コロンは安全ではありません。 こちらを参照

0
Bob