Какой EncodeFor следует использовать для определения местоположения? - PullRequest
0 голосов
/ 10 октября 2018

Какой EncodeFor следует использовать location()?

Если я хочу передать некоторые данные через местоположение, как они должны выглядеть?

location("obtainBDK.cfm?message=#ErrorMessage#", false); // nothing

ИЛИ

location("obtainBDK.cfm?message=#EncodeForHTMLAttribute(ErrorMessage)#", false);

ИЛИ

location("obtainBDK.cfm?message=#EncodeForURL(ErrorMessage)#", false);

ИЛИ

Что-то еще?

1 Ответ

0 голосов
/ 10 октября 2018

cflocation / location устанавливает HTTP-заголовок Location.Браузер считывает это значение и запрашивает упомянутый ресурс через HTTP GET.Указанный URI должен быть закодирован.

Теперь единственная часть URI, которая требует кодирования, - это строка запроса, которая начинается со знака вопроса ?.Каждая пара ключ-значение состоит из закодированного ключа, знака равенства = и закодированного значения.Несколько пар разделяются амперсандом &.

Согласно RFC 1738 :

Таким образом, только буквенно-цифровые символы, специальные символы "$ -_.+! * '(), "и зарезервированные символы, используемые для их зарезервированных целей, могут использоваться без кодировки в URL.

Пример зарезервированных символов

Uncocoded URI:
http://example.org/path?&=&&===&?

Ожидаемые пары ключ-значение:

- "&": "&"
- "=": "="
- "?": ""

Однако правильный синтаксический анализатор будет видеть только пустые ключи и значения.Нам необходимо закодировать ключи и значения, чтобы они не обрабатывались по их техническому назначению.

Кодированный URI: http://example.org/path?%26=%26&%3D=%3D&%3F&%20=%20!

Теперь все символы в ключе и значении кодируются в процентах в соответствии с RFC 3986 и не может быть ошибочно обработан синтаксическим анализатором.

ColdFusion:

kvps = [];

key = "message";
val = ErrorMessage;
kvps.append(
    urlEncodedFormat(key) & "=" & urlEncodedFormat(val)
);

targetUrl = "btainBDK.cfm?" & arrayToList(kvps, "&");
location(targetUrl, false);

urlEncodedFormat и encodeForUrl

Хотя ...

Adobe рекомендует использовать функцию EncodeForURL, а не функцию URLEncodedFormat, чтобы экранировать специальные символы в строке для использования в URL-адресе ввсе новые приложения.

Я столкнулся с проблемами, когда + не может быть должным образом различен между пробелом или фактическим знаком плюс, особенно при изменении контекста (CF <-> JS),Поэтому я бы порекомендовал urlEncodedFormat независимо от мнения Adobe об этом.

...