Должен ли я кодировать параметр строки запроса, являющийся URL-адресом?

Просто скажите, что у меня есть следующий URL-адрес с параметром строки запроса, который является URL-адресом:

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

Следует ли кодировать URL-адрес параметра next? Если да, то кто отвечает за его декодирование - веб-браузер или мое веб-приложение?

Причина, по которой я спрашиваю, заключается в том, что я вижу множество крупных сайтов, на которых выполняются следующие действия:

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

В приведенном выше описании они не беспокоятся о кодировании параметра next, потому что я предполагаю, что они знают, что у него нет никаких параметров строки запроса. Можно ли это сделать, если мой next url также не включает параметры строки запроса?


person Brad Parks    schedule 22.09.2014    source источник


Ответы (2)


RFC 2396 сек. 2.2 говорит, что вы должны кодировать эти символы в URL везде, где они не используются в явном виде; т.е. вы всегда должны формировать targetUrl + '?next=' + urlencode(nextURL).

Веб-браузер вообще не «декодирует» эти параметры; браузер ничего не знает о параметрах, а просто передает строку. Строка запроса в форме 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 уже сделал это за вас; на других языках вы захотите разделить первый символ ?, затем разделить на символы &, затем разделить первый символ =, а затем расшифровать URL-адрес и имя, и значение.

person CR Drost    schedule 22.09.2014
comment
RFC 3986 делает RFC 2396 устаревшим. Возможно, этот ответ нуждается в обновлении. - person Thomas Turrell-Croft; 27.06.2021

Согласно RFC 3986:

Компонент запроса обозначается первым знаком вопроса (?) И заканчивается знаком числа (#) или концом URI.

Итак, следующий URI действителен:

http://www.example.com?next=http://www.example.com

Следующий отрывок из RFC поясняет это:

... поскольку компоненты запроса часто используются для передачи идентифицирующей информации в форме пар ключ = значение, а одно часто используемое значение является ссылкой на другой URI, иногда для удобства использования лучше избегать процентного кодирования этих символов.

Стоит отметить, что RFC 3986 делает RFC 2396 устаревшим.

person Thomas Turrell-Croft    schedule 27.06.2021