Как безопасно кодировать URL-адрес с помощью JavaScript, чтобы его можно было вставить в строку GET?
var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;
Я предполагаю, что вам нужно закодировать myUrl
переменную во второй строке?
javascript
url
urlencode
nickf
источник
источник
Ответы:
Проверьте встроенную функцию encodeURIComponent (str) и encodeURI (str) .
В вашем случае это должно работать:
источник
escape
также является допустимым вариантом.encodeURI
не совсем безопасен для кодирования URL.:
,/
и@
т. Д. Эти два метода не должны использоваться взаимозаменяемо, вы должны знать, что вы кодируете, чтобы использовать правильный метод.У вас есть три варианта:
escape()
не будет кодировать:@*/+
encodeURI()
не будет кодировать:~!@#$&*()=:/,;?+'
encodeURIComponent()
не будет кодировать:~!*()'
Но в вашем случае, если вы хотите передать URL в
GET
параметр другой страницы, вы должны использоватьescape
илиencodeURIComponent
, но не использоватьencodeURI
.См. Вопрос о переполнении стека. Рекомендация : escape или encodeURI / encodeURIComponent для дальнейшего обсуждения.
источник
%uxxx
.Придерживайтесь
encodeURIComponent()
. ФункцияencodeURI()
не пытается кодировать много символов, имеющих семантическое значение в URL (например, «#», «?» И «&»).escape()
устарела и не имеет смысла кодировать символы «+», которые будут интерпретироваться как закодированные пробелы на сервере (и, как указано другими здесь, неправильно кодирует URL-адреса не-ASCII-символов).Есть хорошее объяснение разницы между
encodeURI()
и вencodeURIComponent()
других местах. Если вы хотите что-то кодировать, чтобы его можно было безопасно включить в качестве компонента URI (например, в качестве параметра строки запроса), вы хотите использовать егоencodeURIComponent()
.источник
Лучший ответ заключается в использовании
encodeURIComponent
на значениях в строке запроса (и нигде больше).Тем не менее, я считаю, что многие API хотят заменить "" на "+", поэтому мне пришлось использовать следующее:
escape
реализован по-разному в разных браузерах иencodeURI
не кодирует много символов (например, # и даже /) - он предназначен для использования с полным URI / URL, не нарушая его - что не очень полезно и не безопасно.И, как указывает @Jochem ниже, вы можете использовать имя
encodeURIComponent()
(каждой) папки, но по какой-то причине эти API-интерфейсы, кажется, не нуждаются+
в именах папок, таких старыхencodeURIComponent
отлично работают.Пример:
источник
http://somedomain/this dir has spaces/info.php?a=this has also spaces
. Его следует преобразовать в:http://somedomain/this%20dir%20has%spaces/info.php?a=this%20has%20also%20spaces
но многие реализации допускают замену «% 20» в строке запроса на «+». Тем не менее, вы не можете заменить «% 20» на «+» в разделе пути URL-адреса, это приведет к ошибке «Не найден», если у вас нет каталога с+
пробелом.encodeURIComponent('+')
, даст вам%2B
, так что вам придется использовать два регулярных выражения ... что, я полагаю, почему-то так работает, потому что '+' are '' в конце кодируются по-разному.Если вы используете JQuery, я бы пошел на
$.param
метод. Он URL кодирует поля сопоставления объектов со значениями, которые легче читать, чем вызывать метод escape для каждого значения.источник
encodeURIComponent () - это путь.
НО вы должны иметь в виду, что есть небольшие отличия от версии php,
urlencode()
и, как упоминалось в @CMS, она не будет кодировать каждый символ. Ребята на http://phpjs.org/functions/urlencode/ сделали js эквивалентнымphpencode()
:источник
Для кодирования URL, как уже было сказано, у вас есть две функции:
а также
Причина обоих заключается в том, что первый сохраняет URL с риском оставить слишком много вещей без изменений, а второй кодирует все необходимое.
С первым вы можете скопировать недавно экранированный URL в адресную строку (например), и он будет работать. Однако ваши неэкранированные '&' будут мешать разделителям полей, '=' будут влиять на имена и значения полей, а '+' будут выглядеть как пробелы. Но для простых данных, когда вы хотите сохранить природу URL того, что вы избегаете, это работает.
Второе - это все, что вам нужно сделать, чтобы ничто в вашей строке не мешало URL. Это оставляет различные неважные символы без экранирования, так что URL остается максимально удобным для чтения человеком без помех. URL, закодированный таким образом, больше не будет работать как URL без его удаления.
Поэтому, если вы можете потратить время, вы всегда хотите использовать encodeURIComponent () - перед добавлением пар имя / значение кодируйте и имя, и значение, используя эту функцию, перед добавлением его в строку запроса.
Мне трудно найти причины для использования encodeURI () - я оставлю это более умным людям.
источник
Подобные вещи я пробовал с обычным JavaScript
источник
Элегантный способ
По моему скромному мнению, самый элегантный способ кодирования параметров запроса - создать объект с такими параметрами, как
и затем закодируйте его, используя:
как указано в этом ответе: https://stackoverflow.com/a/53171438/7284582
источник
Чтобы предотвратить двойное кодирование, рекомендуется декодировать URL-адрес перед кодированием (например, если вы имеете дело с введенными пользователем URL-адресами, которые могут быть уже закодированы).
Допустим, мы имеем в
abc%20xyz 123
качестве входных данных (один пробел уже закодирован):источник
Что такое кодировка URL:
URL-адрес должен быть закодирован, если в нем есть специальные символы. Например:
В этом примере мы можем наблюдать, что все символы, кроме строки
notEncoded
, кодируются знаками%. Кодировка URL также называется процентной кодировкой поскольку она экранирует все специальные символы с помощью%. Затем после этого знака% каждый специальный символ имеет уникальный кодЗачем нам нужна кодировка URL:
Некоторые символы имеют специальное значение в строке URL. Например,? символ обозначает начало строки запроса. Чтобы успешно найти ресурс в сети, необходимо различать, когда символ подразумевается как часть строки или часть структуры URL.
Как мы можем добиться кодирования URL в JS:
JS предлагает набор встроенных служебных функций, которые мы можем использовать для простого кодирования URL. Это два удобных варианта:
encodeURIComponent()
: Принимает компонент URI в качестве аргумента и возвращает закодированную строку URI.encodeURI()
: Принимает URI в качестве аргумента и возвращает закодированную строку URI.Пример и предостережения:
Помните, что не следует передавать весь URL (включая схему, например, https: //) в
encodeURIComponent()
. Это может фактически превратить его в не функциональный URL. Например:Мы можем наблюдать, если мы поместим весь URL в
encodeURIComponent
том, что косые черты (/) также преобразуются в специальные символы. Это приведет к тому, что URL больше не будет работать должным образом.Поэтому (как следует из названия) используйте:
encodeURIComponent
на определенной части URL, который вы хотите кодировать.encodeURI
на весь URL, который вы хотите кодировать.источник
У меня ничего не получалось. Я видел только HTML-код страницы входа, возвращаясь на клиентскую сторону с кодом 200. (Сначала 302, но тот же Ajax-запрос, загружающий страницу входа в другой Ajax-запрос, который должен был быть перенаправлением, а не простой загрузкой текст страницы входа).
В контроллере входа я добавил эту строку:
И в глобальном обработчике Ajax я сделал это:
Теперь у меня нет никаких проблем, и это работает как шарм.
источник
Кодировать строку URL
источник
Вот ЖИВОЙ DEMO из
encodeURIComponent()
иdecodeURIComponent()
JS встроенных функций:источник
Вы можете использовать библиотеку esapi и кодировать свой URL, используя функцию ниже. Функция гарантирует, что «/» не будут потеряны для кодирования, в то время как остальная часть текстового содержимого закодирована:
https://www.owasp.org/index.php/ESAPI_JavaScript_Readme
источник
Используйте
fixedEncodeURIComponent
функцию для строгого соответствия RFC 3986 :источник
Вы не должны использовать
encodeURIComponent()
напрямую.Взгляните на RFC3986: унифицированный идентификатор ресурса (URI): общий синтаксис
Эти зарезервированные символы из определения URI в RFC3986 НЕ экранированы
encodeURIComponent()
.MDN Web Docs: encodeURIComponent ()
Используйте функцию MDN Web Docs ...
источник