Кодировать URL-адрес в JavaScript?


Answers

У вас есть три варианта:

  • escape() не будет кодировать: @*/+

  • encodeURI() не будет кодировать: ~!@#$&*()=:/,;?+'

  • encodeURIComponent() не будет кодировать: ~!*()'

Но в вашем случае, если вы хотите передать URL в параметр GET другой страницы, вы должны использовать escape или encodeURIComponent , но не encodeURI .

См. Вопрос «Переполнение стека». Лучшая практика: escape или encodeURI / encodeURIComponent для дальнейшего обсуждения.

Question

Как вы безопасно кодируете URL-адрес с помощью JavaScript, чтобы его можно было помещать в строку GET?

var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;

Я предполагаю, что вам нужно кодировать переменную myUrl на этой второй строке?




Вы можете использовать библиотеку esapi и закодировать свой url, используя следующую функцию. Функция терпит, что '/' не теряются для кодирования, пока остальная часть текстового содержимого закодирована:

function encodeUrl(url)
{
    String arr[] = url.split("/");
    String encodedUrl = "";
    for(int i = 0; i<arr.length; i++)
    {
        encodedUrl = encodedUrl + ESAPI.encoder().encodeForHTML(ESAPI.encoder().encodeForURL(arr[i]));
        if(i<arr.length-1) encodedUrl = encodedUrl + "/";
    }
    return url;
}

https://www.owasp.org/index.php/ESAPI_JavaScript_Readme




Ничто не сработало для меня. Все, что я видел, это HTML-страница входа в систему, возвращающаяся на клиентскую сторону с кодом 200. (302 сначала, но тот же Ajax-запрос, загружающий страницу входа в другой Ajax-запрос, который должен был быть перенаправлением, а не загрузкой простого текст страницы входа в систему).

В контроллере входа я добавил эту строку:

Response.Headers["land"] = "login";

И в глобальном обработчике Ajax я сделал это:

$(function () {
    var $document = $(document);
    $document.ajaxSuccess(function (e, response, request) {
        var land = response.getResponseHeader('land');
        var redrUrl = '/login?ReturnUrl=' + encodeURIComponent(window.location);
        if(land) {
            if (land.toString() === 'login') {
                window.location = redrUrl;
            }
        }
    });
});

Теперь у меня нет никаких проблем, и это работает как шарм.




Лично я считаю, что многие API-интерфейсы хотят заменить «" на «+», поэтому я использую следующее:

encodeURIComponent(value).replace(/%20/g,'+');

escape реализуется по-разному в разных браузерах, и encodeURI не кодирует большинство символов, которые являются функциональными в URI (например, # и даже /) - это делается для использования на полном URI / URL, не нарушая его.

ПРИМЕЧАНИЕ . Вы используете encodeURIComponent для значений строки запроса (не имена полей / значений и, определенно, не весь URL-адрес). Если вы сделаете это любым другим способом, он не будет кодировать символы типа =,?, &, Возможно, оставив вашу строку запроса открытой.

Пример:

const escapedValue = encodeURIComponent(value).replace(/%20/g,'+');
const url = 'http://example.com/?myKey=' + escapedValue;



Подобная вещь, которую я пробовал с обычным javascript

function fixedEncodeURIComponent(str){
     return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}



encodeURIComponent () - это путь.

var myOtherUrl = "http://example.com/index.html?url=" + encodeURIComponent(myUrl);

НО вы должны иметь в виду, что есть небольшие отличия от php-версии urlencode (), и, как упоминалось в @CMS, она не будет кодировать каждый символ. Ребята в http://phpjs.org/functions/urlencode/ сделали js эквивалентным phpencode ():

function urlencode(str) {
  str = (str + '')
    .toString();

  // Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current
  // PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following.
  return encodeURIComponent(str)
    .replace(/!/g, '%21')
    .replace(/'/g, '%27')
    .replace(/\(/g, '%28')
    .
  replace(/\)/g, '%29')
    .replace(/\*/g, '%2A')
    .replace(/%20/g, '+');
}





Links