Подтвердить что ты не робот

Слишком чувствительны ли строки строки запроса?

Предположим, у меня есть такой URL:

http://www.example.com?key=123&KEY=198

Тогда каков будет результат

request.querystring("key")

and 

request.querystring("KEY")

Я немного смущен.

4b9b3361

Ответ 1

В RFC для URI говорится:

6.2.2.1. Нормализация случая

Когда URI использует компоненты общего синтаксиса, всегда применяются правила эквивалентности синтаксиса компонентов; а именно, что схема и хост не чувствительны к регистру и поэтому должны быть нормализованы к строчным. Например, URI эквивалентен http://www.example.com/.

Предполагается, что другие компоненты общего синтаксиса чувствительны к регистру, если в схеме не указано иное (см. раздел 6.2.3).

Обратите внимание, что схема (здесь "http"), host (имя сервера) нечувствительны к регистру, но в любом случае должны быть строчными. Остальное зависит от регистра, если вы не используете другую схему, которая явно говорит, что она должна быть нечувствительной.

Таким образом, ключ и KEY - это разные вещи во всех основанных на http URI в соответствии со спецификацией.

Редактировать: @Nicholas отчасти ошибается, полагая, что орган определяет, что он принимает, что верно для пользовательских схем и органов, которые определяют свои собственные URI, но http - это четко определенная спецификация, которой соответствует каждый (или у вас могут быть запросы http, которые имеют, скажем, символ pipes как разделитель. Представьте себе хаос!)

спецификация RFC для HTTP гласит:

Схема и хост не чувствительны к регистру и обычно предоставляются в в нижнем регистре; все остальные компоненты сравниваются с учетом регистра манера. Символы, отличные от указанных в "зарезервированном" наборе, эквивалентно их октетам, закодированным в процентах: нормальная форма не кодировать их (см. разделы 2.1 и 2.2 [RFC3986]).

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

Ответ 2

Ответ @gbjbaanb неверен: в RFC указывается только разрешенный набор символов для строки запроса. Как и компоненты пути и фрагмента URI, компонент URI запроса имеет значение только для полномочий, предоставляющих ресурс.

Это полностью зависит от того, является ли этот материал чувствительным к регистру или нет.

В случае С# и IIS резервным хранилищем для проанализированной строки запроса в объекте HttpRequest является System.Collections.Specialized.NameValueCollection которая оказывается нечувствительной к регистру (по умолчанию).

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

Кроме того, поскольку сама страница (и JavaScript на стороне клиента) имеют доступ к необработанному URI, они могут делать с ней все, что захотят.

Если строка запроса создается в результате отправки формы HTML, ключи (имена) берутся из значения атрибута name элемента управления формы, который, согласно спецификациям HTML, чувствителен к регистру. Но насколько я знаю, никто на самом деле не делает этого.

Итак, в конце дня вы должны знать, что ожидает обработчик запросов в строке запроса. Это может (или не может) быть чувствительным к регистру.

Ответ 3

Согласно hurl.it, key будет равно 123 и key, 198. Они будут доступны как два разных запроса.