2012-02-12 4 views
8

javascriptのencodeURI関数に有効な用途はありますか?これまでにencodeURIを使用する必要がありますか?

  • 完全なURI
  • のいずれかであるあなたがURIに入れたいいくつかの断片を、:私の知る限り、あなたが持っている必要がありますいずれかのHTTPリクエストを作成しようとしているとき、言うことができるように

    ユニコード文字列またはUTF-8バイトシーケンス

最初のケースでは、明らかに要求する必要はありません。注:実際にパラメータとして渡す場合(例:?url = http ...)、実際にはURIのように見える2番目のケースのインスタンスがあります。第2のケースで

、あなたは常にはUTF-8にUnicode文字列を変換し、URIに追加する前すべて文字をエスケープするencodeURIComponentでを呼び出す必要があります。 (Unicode文字列ではなくUTF-8バイトシーケンスを使用している場合は、convert-to-utf8ステップをスキップできます)。

私が何か逃してしまったと仮定すると、私はencodeURIの有効な使用を見ることができません。あなたがそれを使うと、あなたは無効なURIを構築した後、事実の後にそれを「浄化」しようとします。文字通りどの文字が意図されていないか、そしてエスケープされることは意図されていないので。

私はescape()の使用に対して多くのアドバイスを見ましたが、encodeURIを落胆させる人はいません。私は有効な使い方がないのですか?

+2

「URIに入れたい断片」は、「URIコンポーネント」と呼ぶことができます。 「2番目のケースでは、JavaScriptではなく、常にUnicode文字列をUTF-8に変換する必要があります。 'encodeURIComponent'は文字列を自動的にUTF-8に変換します(そして' decodeURIComponent'はUTF-8オクテットをUnicode文字に変換します)。 – mgiuca

答えて

10

私はblog postを持っています。この質問には、多くの詳細があります。

あなたはあなたが言う理由のために、プログラムでURIを構築するためにencodeURIを使用しないん - あなたは、常に個々のコンポーネントにencodeURIComponentを使用して、完全なURIにそれらを構成する必要があります。 encodeURIはほとんど有用なのは、誰かがあなたに完全なURIを与えた場合、それは、(「あなたが受け入れるものにリベラル、とあなたが送る何で保守的である。」)Postel's Lawに従い、URIを「掃除」であるある

スペース、特定のASCII文字(二重引用符など)、Unicode文字などの不正な文字を含むことがあります。 encodeURIは、エンコード区切り文字を使用せずに、これらの不正な文字を正当なパーセントエスケープシーケンスに変換するために使用できます。同様に、decodeURIは、URIを「きれいに印刷する」ために、パーセントでエスケープされたシーケンスを技術的に不法な裸の文字として表示することができます。

例えば、URL:

http://example.com/admin/login?name=Helen Ødegård&gender=f 

は違法ですが、それはまだ完全に曖昧でありません。encodeURIは、有効なURIに変換:

http://example.com/admin/login?name=Helen%20%C3%98deg%C3%A5rd&gender=f 

「URIクリーニング」のこの種をしたいかもしれないアプリケーションの例としては、Webブラウザです。アドレスバーにURLを入力すると、エラーが発生するだけでなく、不正な文字をパーセントエスケープに変換しようとします。 URIを処理するソフトウェア(例えば、ページ上のハイパーリンク内のすべてのURLを取得したいHTMLスクレーパー)は、いずれかのURLが技術的に不法である場合に備えて、この種のクリーニングを適用することもできます。

残念ながら、encodeURIには、「%」文字をエスケープするという致命的な欠陥があり、URIのクリーンアップには全く役に立たない(すでにパーセントエスケープされているURIをダブルエスケープする)。私はそのためMozilla's fixedEncodeURI機能を借りて、それが正しくURIを清掃するので、それを改善している。だから、あなたは常に内部URIを構築するためにencodeURIComponentを使用する必要があります

function fixedEncodeURI(str) { 
    return encodeURI(str).replace(/%25/g, '%').replace(/%5B/g, '[').replace(/%5D/g, ']'); 
} 

を。 encodeURIは決して使用しないでください。私のfixedEncodeURIを使用して、外部ソースから(通常はユーザーインターフェイスの一部として)提供されたURIを「クリーンアップ」しようとすることができます。

+1

私はここでの使用方法を見ていますが、私はencodeURIがあなたの記述の実装であるとは確信していません。 encodeURIは、 "%2F"を "%252F"に変換します。これは、その一部を二重エスケープすることによってURIの意味を変更します。 – gfxmonk

+0

ああ、そうです。ブログの投稿を更新しました(「編集」を検索してください)。これにはfixedEncodeURIという関数が含まれています(Mozillaから借りて改良しました)、実際に私が元々記述した方法で動作します。実際のencodeURI関数はそのままで、完全なゴミです。 – mgiuca

+0

私はencodeURIの脆弱性を示す答えを編集し、回避策を提案しました。 – mgiuca

5

encodeURIは以下をエンコードしません。、/? :@ & = + $#encodeURIComponentはそうですが。

URLを可変値として割り当てるなど、encodeURIをencodeURIComponentよりも使用したい場合は、さまざまな理由があります。 URLは維持したいが、パス、クエリ文字列、ハッシュ値をエンコードする必要があります。 encodeURIComponentを使用すると、URLが無効になります。

+1

「URLを可変値として割り当てる」とはどういう意味ですか?クエリパラメータの値としてURLを含めることを意味しますか? "http://example.com/?x=1&y=2"のようなURLがあり、それをクエリのパラメータとして渡したい場合は、encodeURIが "&"をエスケープしないので、必ずencodeURIComponentを使用してください。 – gfxmonk

+0

var x = myencodedurl; –

+0

申し訳ありませんが、それは意味をなさない。変数に変数を格納するために、文字列の_value_(URIがJS内にあるもの)を変更するのはなぜですか? – gfxmonk

関連する問題