должен ли когда-либо использоваться кодировщик? - PullRequest
8 голосов
/ 12 февраля 2012

Есть ли какое-либо допустимое использование для функции javascript encodeURI?

Насколько я могу судить, когда вы пытаетесь сделать HTTP-запрос, вы должны иметь:

  • полный URI
  • некоторый фрагмент, который вы хотите поместить в URI, который является либо строкой Unicode, либо последовательностью байтов UTF-8

В первом случае, очевидно, ничего не нужно делать, чтобы запросить его. Примечание: если вы действительно хотите передать его как параметр (например,? Url = http ...), тогда у вас есть экземпляр второго случая, который выглядит как URI.

Во втором случае вы должны всегда конвертировать строку юникода в UTF-8 и затем вызывать encodeURIComponent для экранирования всех символов перед добавлением ее в URI. (Если у вас есть последовательность байтов UTF-8 вместо строки Юникода, вы можете пропустить шаг преобразования в utf8).

Предполагая, что я ничего не пропустил, я не вижу правильного использования для encodeURI. Если вы используете его, скорее всего, вы создали недопустимый URI, а затем попытались «санировать» его после факта, что просто невозможно, поскольку вы не знаете, какие символы были предназначены буквально, а какие были предназначены для экранирования .

Я видел много советов против использования escape (), но не вижу никого, кто бы препятствовал encodeURI. Я пропускаю действительное использование?

Ответы [ 2 ]

11 голосов
/ 12 февраля 2012

У меня есть сообщение в блоге , в котором подробно и подробно дается ответ на этот вопрос.

Вы должны никогда использовать encodeURI для программного создания URI, по причинам, которые вы говорите - вы всегда должны использовать encodeURIComponent для отдельных компонентов, а затем объединять их в полный URI.

Где encodeURI означает почти . Полезно использовать «очистку» URI в соответствии с Законом Постеля («Будьте либеральны в том, что вы принимаете, и консервативны в том, что вы отправляете» . ") Если кто-то дает вам полный URI, он может содержать недопустимые символы, такие как пробелы, определенные символы ASCII (например, двойные кавычки) и символы Unicode. encodeURI может использоваться для преобразования этих недопустимых символов в допустимые последовательности с экранированием процентов без кодировки разделителей. Точно так же decodeURI можно использовать для «симпатичной печати» URI, показывая последовательности с экранированием процентов в виде технически недопустимых пустых символов.

Например, URL:

http://example.com/admin/login?name=Helen Ødegård&gender=f

незаконно, но все еще совершенно однозначно. encodeURI преобразует его в действительный URI:

http://example.com/admin/login?name=Helen%20%C3%98deg%C3%A5rd&gender=f

Примером приложения, которое может захотеть выполнить подобную «очистку URI», является веб-браузер. Когда вы вводите URL-адрес в адресную строку, он должен пытаться преобразовать любые недопустимые символы в процентные экранирования, а не просто иметь ошибку. Программное обеспечение, которое обрабатывает URI (например, HTML-скребок, который хочет получить все URL-адреса в гиперссылках на странице), также может захотеть применить этот вид очистки в случае, если какой-либо из URL-адресов технически недопустим.

К сожалению, encodeURI имеет критическую уязвимость, заключающуюся в том, что он экранирует символы "%", что делает его абсолютно бесполезным для очистки URI (он будет дважды экранировать любой URI, который уже имеет процентные экранирования). Поэтому я позаимствовал функцию Mozilla fixedEncodeURI и улучшил ее, чтобы она корректно очищала URI:

function fixedEncodeURI(str) {
    return encodeURI(str).replace(/%25/g, '%').replace(/%5B/g, '[').replace(/%5D/g, ']');
}

Так что вы всегда должны использовать encodeURIComponent для внутреннего создания URI. Вы никогда не должны использовать encodeURI, но вы можете использовать мой fixedEncodeURI, чтобы попытаться «очистить» URI, которые были предоставлены из внешнего источника (обычно как часть пользовательского интерфейса).

5 голосов
/ 12 февраля 2012

encodeURI не кодирует следующее:, /? : @ & = + $ #, тогда как encodeURIComponent делает.

Существует множество причин, по которым вам может понадобиться использовать encodeURI вместо encodeURIComponent, например, присвоить URL-адрес в качестве значения переменной. Вы хотите сохранить URL, но кодировать пути, строку запроса и значения хеша. Использование encodeURIComponent сделает URL недействительным.

...