Какой EncodeFor следует использовать для определения местоположения?

Который EncodeFor должен быть использован location()?

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

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

ИЛИ ЖЕ

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

ИЛИ ЖЕ

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

ИЛИ ЖЕ

Что-то другое?

1 ответ

Решение

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

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

Согласно RFC 1738:

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

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

Незашифрованный URI:
http://example.org/path?&=&&===&?

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

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

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

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

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

Холодный синтез:

kvps = [];

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

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

urlEncodedFormat vs. encodeForUrl

Хотя...

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

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

Другие вопросы по тегам