Codificar o URL em JavaScript?

como é que codificas com segurança um URL usando JavaScript de modo a que possa ser colocado num texto GET?

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

presumo que precises de codificar a variável myUrl nessa segunda linha?

Author: ProgramFOX, 2008-12-02

13 answers

Vê a função incorporada encodeURIComponent(str) e encodeURI(str).
No seu caso, isto deve funcionar.

var myOtherUrl = 
       "http://example.com/index.html?url=" + encodeURIComponent(myUrl);
 2531
Author: Buu Nguyen, 2011-09-29 10:01:37

Tens três opções:

  • escape() não codificar: @*/+

  • encodeURI() não codificar: ~!@#$&*()=:/,;?+'

  • encodeURIComponent() não codificar: ~!*()'

Mas no seu caso, se quiser passar um URL para um parâmetro GET de outra página, deve usar escape ou encodeURIComponent, mas não encodeURI.

Ver a questão do excesso de fluxo da pilha melhores práticas: fuga ou encodeURI / encodeuricomponente para mais informações discussao.

 1393
Author: CMS, 2017-05-23 12:02:48
Fica com encodeURIComponent(). A função encodeURI() não se dá ao trabalho de codificar muitos personagens que têm importância semântica em URLs (por exemplo,"#","?", e "&"). escape() é desactualizado, e não se dá ao trabalho de codificar caracteres"+", que serão interpretados como espaços codificados no servidor (e, como indicado por outros aqui, não codifica corretamente caracteres não-ASCII). Há uma boa explicação para a diferença entre encodeURIComponent() alhures. Se você quiser codificar algo para que ele possa ser incluído com segurança como um componente de um URI (por exemplo, como um parâmetro de pesquisa string), você quer usar encodeURIComponent().
 158
Author: Mike Brennan, 2017-05-23 12:02:48

Pessoalmente, acho que muitas APIs querem substituir "" por " + " por isso uso o seguinte:

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

escape é implementado de forma diferente em diferentes navegadores e encodeURI não codifica a maioria dos caracteres que são funcionais em um URI (como # E even/) -- ele é feito para ser usado em um URI/URL completo sem quebrá-lo.

Nota : você usa a encodeuricomponente para os valores no texto da Pesquisa (não os campos/nomes dos valores e definitivamente não o URL completo). Se o fizer de outra forma, não irá codificar caracteres como:,&, possivelmente deixando o seu texto de consulta exposto.

Exemplo:

const escapedValue = encodeURIComponent(value).replace(/%20/g,'+');
const url = 'http://example.com/?myKey=' + escapedValue;
 66
Author: Ryan Taylor, 2018-09-26 17:53:06
Se estás a usar jQuery, eu optaria por$.param método. Ele URL codifica um campo de mapeamento de objetos para valores, que é mais fácil de ler do que chamar um método de escape em cada valor.
$.param({a:"1=2", b:"Test 1"}) // gets a=1%3D2&b=Test+1
 35
Author: Maksym Kozlenko, 2014-05-25 22:55:43

Para codificar uma URL, como já foi dito antes, você tem duas funções:

encodeURI()

E

encodeURIComponent()

A razão de ambos existirem é que o primeiro preserva a URL com o risco de deixar demasiadas coisas por colher, enquanto o segundo codifica tudo o que é necessário.

Com o primeiro, você poderia copiar a URL recém-escapada para a barra de endereços (por exemplo) e ela funcionaria. No entanto, os seus ' & ' S não identificados interferem com os delimitadores de campo, Os '= ' s interferem com os nomes de campo e valores, e os ' + ' seriam como espaços. Mas para dados simples quando você quer preservar a natureza URL do que você está escapando, isso funciona.

O segundo é tudo o que você precisa fazer para se certificar de que nada no seu texto interfere com uma URL. Ele deixa vários caracteres sem importância sem forma para que a URL permaneça o mais legível possível sem interferência. Um URL codificado desta forma não funcionará mais como um URL sem o desmascarar.

Então, se você pode tomar o tempo, você deseja Sempre usar o encodeURIComponent () -- antes de adicionar os pares nome/valor codificam tanto o nome como o valor usando esta função antes de adicioná-lo ao texto da consulta.

Estou a ter dificuldades em arranjar razões para usar os encodeURI.deixo isso para os mais inteligentes.
 9
Author: Gerard ONeill, 2017-01-26 21:31:43

A Encodeuricomponente () é o caminho a seguir.

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

Mas você deve ter em mente que existem pequenas diferenças da versão php urlencode() e como @CMS mencionado, ela não irá codificar todos os caracteres. Tipos em http://phpjs.org/functions/urlencode / made js equivalent to 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, '+');
}
 8
Author: Adam Fischer, 2018-09-01 05:11:25

Tipo de coisa semelhante que tentei com javascript normal

function fixedEncodeURIComponent(str){
     return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}
 4
Author: Narayan Yerrabachu, 2013-05-14 08:01:41

Para evitar codificação dupla é uma boa ideia descodificar o url antes da codificação (se estiver a lidar com urls introduzidos pelo Utilizador, por exemplo, que poderão já estar codificados).

Digamos que temos abc%20xyz 123 como entrada (um espaço já está codificado):

encodeURI("abc%20xyz 123")            //   wrong: "abc%2520xyz%20123"
encodeURI(decodeURI("abc%20xyz 123")) // correct: "abc%20xyz%20123"
 3
Author: serg, 2017-01-05 18:49:48
Nada funcionou comigo. Tudo o que eu estava vendo era o HTML da página de login, voltando ao lado do cliente com o código 200. (302 no início, mas o mesmo Ajax requisitar carregar página de login dentro de outro pedido Ajax, que era suposto ser um redirecionamento em vez de carregar texto simples da página de login).

No controlador de autenticação, adicionei esta linha:

Response.Headers["land"] = "login";
E no global Ajax handler, fiz isto:
$(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;
            }
        }
    });
});
Agora Não tenho nenhum problema, e funciona como um charme.
 2
Author: Asif Ashraf, 2013-01-03 07:31:07

Codificar o texto do URL

    var url = $(location).attr('href'); //get current url
    //OR
    var url = 'folder/index.html?param=#23dd&noob=yes'; //or specify one

var encodedUrl = encodeURIComponent(url);
console.log(encodedUrl);
//outputs folder%2Findex.html%3Fparam%3D%2323dd%26noob%3Dyes


for more info go http://www.sitepoint.com/jquery-decode-url-string
 1
Author: Sangeet Shah, 2015-09-10 06:41:37

Você pode usar a biblioteca esapi e codificar o seu url usando a função abaixo. A função assegura que ' / ' não são perdidos para codificação enquanto o resto do conteúdo do texto é codificado:

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

 0
Author: Mohith Maratt, 2016-09-27 15:59:49

Qual é a codificação de URL:

Um URL deve ser codificado quando existem caracteres especiais localizados dentro do URL. Por exemplo:

console.log(encodeURIComponent('?notEncoded=&+'));

Podemos observar neste exemplo que todos os caracteres, excepto o texto notEncoded, estão codificados com % de sinais. A codificação URL também é conhecida como codificação percentual Porque escapa a todos os caracteres especiais com um %. Depois deste sinal de%, cada carácter especial tem um carácter único Código

Porque precisamos de codificação de URL:

Certos caracteres têm um valor especial num texto URL. Por exemplo, o ? caractere denota o início de um texto de consulta. A fim de com sucesso localizar um recurso na web, é necessário distinguir entre quando um personagem é feito como parte de string ou parte da estrutura url.

Como podemos obter codificação de URL em JS:

O JS oferece uma série de funções de utilidade que podemos usar facilmente. codificar os URL ' s. Estas são duas opções convenientes:
  1. encodeURIComponent(): toma um componente de um URI como argumento e devolve o texto URI codificado.
  2. encodeURI(): toma um URI como argumento e devolve o texto URI codificado.

Exemplo e advertências:

Esteja ciente de não passar o URL completo (incluindo scheme, p.ex. https://) em encodeURIComponent(). Isso pode realmente transformá-lo em uma URL não funcional. Para exemplo:

// for a whole URI don't use encodeURIComponent it will transform
// the / characters and the URL won't fucntion properly
console.log(encodeURIComponent("http://www.random.com/specials&char.html"));

// instead use encodeURI for whole URL's
console.log(encodeURI("http://www.random.com/specials&char.html"));

Nós podemos observar f Nós colocamos todo o URL em {[[6]} que os cortes do foward ( / ) também são convertidos em caracteres especiais. Isso fará com que a URL não funcione corretamente mais.

Portanto (como o nome implica) use:

  1. encodeURIComponent numa certa parte de um URL que você quer codificar.
  2. encodeURI num URL completo que deseja codificar.
 0
Author: Willem van der Veen, 2018-09-23 08:35:26