2017-02-15 8 views
4

Я просматривал код, и я увидел что-то вроде этого:?ли и разрешены в URL

if (result.indexOf('?') === -1) { 
    result += '?'; 
} 
result += '&' + SOMETHING; 

Очевидно, что это может привести к URL, как этот http://example.com?&a=b

автор кода не видит ничего необычного в коде, но ? & беспокоит меня. Я не мог найти никаких ограничений в RFC для URI, чтобы доказать его неправоту (или, может быть, я пропустил это).

Очевидно, что в закладке сетевого Chrome Девых инструментов она выглядит как пустая пара: enter image description here

Если URL-адрес, как это беспокоит меня или я просто параноик?

+2

Я уверен, что это действительно так: любой клиент, которого я когда-либо видел, считает его действительным. Параметры запроса могут быть одинарными терминами ('http: //example.com? Queryparam'), и переход от полностью пустого параметра запроса оттуда невелик. –

+1

Что вас беспокоит и не будет действительным? – j08691

+4

@ j08691: Для кого-то неразумно найти строку запроса, начинающуюся с & необычного. – BoltClock

ответ

6

Этот случай будет считаться пустым значением для большинства серверов, так что да, действительно, это действительно так. Что произойдет, так это то, что сервер проверяет от ? и каждые &, а затем разделяет значения на = соответственно.

Так что, когда между ? и & (или двумя) значения отсутствуют, значения будут пустыми. Недопустимое значение = будет влиять на значение «или», но это не сделает запрос неверным.

Остерегайтесь этого, потому что некоторые синтаксические анализаторы могут не найти его действительным, поэтому при использовании настраиваемых парсеров могут возникнуть проблемы (например, в JavaScript).

+1

Я говорил о пользовательском JavaScript, потому что некоторые люди могут использовать JavaScript для самостоятельного анализа 'loaction.serach'. – NikxDa

+0

Я удалил свой предыдущий комментарий, поскольку он вводил в заблуждение. Я все еще не уверен в том, что анализ javascript имеет значение в этом случае, но если OP удовлетворяет этому ответу, все хорошо :) – Aaron

+0

Я еще раз попытаюсь объяснить свою мысль: некоторые люди могут использовать парсеры на стороне клиента для извлечения значений из самой строки местоположения (которая содержится в 'location.hash'). Несмотря на то, что браузер принимает '? &', Эти синтаксические анализаторы могут не отображаться - что приведет к ошибкам JavaScript на стороне клиента. – NikxDa

4

Я написал a blog post о некоторых из этих краевых случаев лет назад.

Т.Л., д-р: да, ?&example действует

Что важно об этом является то, что вы определяете ключ "" со значением null.

Вы можете в значительной степени гарантировать, что почти никакие библиотеки не поддерживают эти пустые строковые ключи, поэтому не полагайтесь на них, но если у вас есть URL-адрес по строкам ?&foo=bar, вы должны быть в порядке при доступе к ключу foo ,