コロン `:`は、わかりやすいURLを使用しても安全ですか?


109

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

http://site/gwturl#section1/section2

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

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

もちろん、これはurlの使いやすさのために行っているので、特別な意味を持つこれらの文字がブラウザや他のシステムによってURLエンコードされ、最終的には次のようなURLにならないようにしたいと思います。この:

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

この方法でコロンを使用すると、ブラウザ、ブックマークシステム、JavascriptやJavaコードでも安全に(つまり、自動的にエンコードされません)ですか?


クライアント側でのみURLを使用することを(より明確に)指定することは良い考えでしょうか?(私のように)多くの回答は、HTTPを使用してサーバーにURLを送信することを想定しているようです。
Veger

フラグメントの使用がクライアント側で行われていることを明確にするために編集されました。
Nicole

10か月後、このURLスキームはうまくいきましたか?同じスキームの使用を検討しています。
ジョナサン・スウィニー2010

1
@ジョナサン・スウィニー、残念ながら、私はこのプロジェクト(および会社)から移りました。新しいプロジェクトを開始する場合は、このスキームを使用#!しますが、ページがステートフルであることを示すためにも使用します-googlewebmastercentral.blogspot.com/2009/10/…を参照してください(この提案は、 FacebookなどのヘビーAJAXユーザーによる)
ニコール

WhatsAppが最初のコロンのURLをカットすることがわかったので、たとえば、GoogleマップのURLが役に立たなくなった。だから、はい、それをエスケープすることが重要です。
ペトルザ

回答:


84

私は最近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は、この部分をサーバーに送信しないことのみを示しています。


編集:

ああ!

URI仕様についての私の主張にも関わらず、HTML 4仕様が要素名/識別子を制限いると彼が指摘したとき、評判が悪いのは正しい答えを提供します。

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


私はあなたが何かに夢中になっていると思います、これをもう少し説明できますか?これをサーバーに送信しないことは問題ではありません。GWTを使用しているからです。あなたが引用したセクションで指定された構文が明確ではないのです。
Nicole

しかし:、gen-delimであり、サブ-delimではありません。
ボビンス、2013年

1
セミコロンはpcharに対して有効であるため、
サブデリームまたはゲンデリムのどちらであっ

@bobince- :はにありpchar、これはにfragmentあるため:、許可されます。@Renesis -ウィキペディアはABNFの記事がありen.wikipedia.org/wiki/ABNF基本的に使用できる文字のリストを見ているあなた/手段ORを。私はGWTプログラミングをまだ行っていないため、URIのフラグメント部分をどのように使用するのかわかりません。
McDowell

最後の質問です。この仕様の実際のアプリケーションへの洞察はありますか?これは、ブラウザーが:フラグメント内のを無視する(またはエンコードをスキップする)べきであることを意味していますか?
Nicole

59

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

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

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

ただし、テストする必要があります。Web標準は厳密に遵守されておらず、標準が矛盾している場合があります。たとえば、HTTP / 1.1 RFC 2616ではリクエストURLでクエリ文字列を使用できませんが、HTMLではGETメソッドを使用してフォームを送信するとクエリ文字列が作成されます。現実の世界で実装された方が最終的に勝利します。


58

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

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


31
最も適切な答え。私たちは皆、仕様にあるものがウェブ開発の現実とほとんど関係がないことを知っています。「世界のトップ10のウェブサイトの1つがそれを行っている」よりも「安全性」のはるかに優れた保証を得るつもりはありません。
Steven Collins、

1
@StevenCollinsこれとまったく同じことを述べているこの問題の3年前に与えられた回答と関連性がありません:)
Martin James

7

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


1
@arbales:はい。一部の非準拠のユーザーエージェントは、非準拠のURLをそのままにします。
Asaph、2010年

4

URLEncoderjavadoc から:

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

文字列をエンコードするときは、次のルールが適用されます。

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

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


3

文字を含むWikipediaのURLの一部をエンコードしているFirefoxまたはIE8が表示されません。


1
Operaもセミコロンを保持しますが、そのような振る舞いを
期待

1
RenesisはURLパスではなくURLフラグメントについて話している。
2010年

ウィキペディアは、この質問を書いたときの私の考えの1つでした。コロンの使用は技術的に無効/安全ですか?エンコードされたWikipediaのURLには通常(および)が表示されますが、コロンは表示されないため、少し混乱しました。
Nicole

3
Wayback Machineのリンクの多くに:があります。たとえば、web.archive.org
web / 20080822150704 / http://stackoverflow.com

2

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


0

コロンは安全ではありません。こちらをご覧ください


そのページは、彼らが安全でない理由を動機づけていません。参照されているRFC2396は、エスケープする必要があるとも述べていません。また、提供されているコンバータスクリプトはそれをエンコードしません(とにかくChrome 9で)。
アダムリンドバーグ

アダムあなたは間違っています。それは、何がなぜなのかを直接述べています。
ktamlyn

-5

これは安全な文字ではなく、ドメイン名の直後にあるときに接続先のポートを区別するために使用されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.