web-dev-qa-db-ja.com

URLであるクエリ文字列パラメータをURLエンコードする必要がありますか?

Urlであるクエリ文字列パラメータを持つ次のURLがあると言ってください。

http://www.someSite.com?next=http://www.anotherSite.com?test=1&test=2

nextパラメータをURLエンコードする必要がありますか?もしそうなら、それをデコードする責任があるのは誰ですか?ウェブブラウザまたは私のウェブアプリ?

私が尋ねる理由は、私が次のようなことをするたくさんの大きなサイトを見ているからです

http://www.someSite.com?next=http://www.anotherSite.com/another/url

上記では、私が推測しているので、彼らはnextパラメータをわざわざエンコードしません。彼らは、クエリ文字列パラメータ自体がないことを知っています。 next URLにクエリ文字列パラメータも含まれていない場合、これで問題ありませんか?

17
Brad Parks

RFC 2396秒2.2 は、明示的な意味で使用されていない場所では、これらの記号をURLエンコードする必要があることを示しています。つまり、常にtargetUrl + '?next=' + urlencode(nextURL)を形成する必要があります。

Webブラウザーは、これらのパラメーターを「デコード」しません。ブラウザはパラメータについて何も知りませんが、文字列を渡すだけです。 http://www.example.com/path/to/query?param1=value&param2=value2の形式のクエリ文字列は、ブラウザから次のようにGET要求されます。

GET /path/to/query?param1=value&param2=value2 HTTP/1.1
Host: www.example.com
(other headers follow)

バックエンドでは、結果を解析する必要があります。 PHPの$_REQUEST配列はすでにこれを行っていると思います。他の言語では、最初の?文字を分割し、次に&文字を分割し、次に最初の=文字を分割し、名前と値の両方をurldecodeします。 。

17
CR Drost