Como você codifica com segurança um URL usando JavaScript para que ele possa ser colocado em uma sequência GET?
var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;
Presumo que você precise codificar a myUrl
variável nessa segunda linha?
javascript
url
urlencode
nickf
fonte
fonte
Respostas:
Confira a função interna encodeURIComponent (str) e encodeURI (str) .
No seu caso, isso deve funcionar:
fonte
escape
também é uma opção válida.encodeURI
não é realmente seguro para codificação de URL.:
,/
,@
etc. Estes 2 métodos não são para ser usado intercambiáveis, você deve saber o que está a codificar para usar o método certo.Você tem três opções:
escape()
não codificará:@*/+
encodeURI()
não codificará:~!@#$&*()=:/,;?+'
encodeURIComponent()
não codificará:~!*()'
Mas no seu caso, se você deseja passar um URL para um
GET
parâmetro de outra página, useescape
ouencodeURIComponent
, mas nãoencodeURI
.Consulte a pergunta sobre estouro de pilha. Prática recomendada: escape ou encodeURI / encodeURIComponent para discussão adicional.
fonte
%uxxx
.Ficar com
encodeURIComponent()
. A funçãoencodeURI()
não se preocupa em codificar muitos caracteres que têm importância semântica nos URLs (por exemplo, "#", "?" E "&").escape()
foi descontinuado e não se preocupa em codificar caracteres "+", que serão interpretados como espaços codificados no servidor (e, conforme apontado por outros aqui, não codificam corretamente caracteres não ASCII).Há uma boa explicação da diferença entre
encodeURI()
e emencodeURIComponent()
outros lugares. Se você deseja 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 string de consulta), você deseja usarencodeURIComponent()
.fonte
A melhor resposta é a utilização
encodeURIComponent
de valores na cadeia de consulta (e em nenhum outro lugar).No entanto, acho que muitas APIs desejam substituir "" por "+", então tive que usar o seguinte:
escape
é implementado de maneira diferente em navegadores diferentes eencodeURI
não codifica muitos caracteres (como # e até /) - é feito para ser usado em um URI / URL completo sem quebrá-lo - o que não é super útil ou seguro.E como o @Jochem aponta abaixo, convém usar o
encodeURIComponent()
nome de uma pasta (cada), mas, por qualquer motivo, essas APIs não parecem querer+
nomes de pastas, de modo que o velho antigoencodeURIComponent
funciona muito bem.Exemplo:
fonte
http://somedomain/this dir has spaces/info.php?a=this has also spaces
. Ele deve ser convertido para:http://somedomain/this%20dir%20has%spaces/info.php?a=this%20has%20also%20spaces
mas muitas implementações permitem que '% 20' na string de consulta seja substituída por '+'. No entanto, você não pode substituir '% 20' por '+' na seção de caminho da URL; isso resultará em um erro Não encontrado, a menos que você tenha um diretório com+
um espaço em vez de um espaço.encodeURIComponent('+')
daria a você%2B
, então você teria que usar duas expressões regulares ... o que eu suponho que seja esse o tipo de coisa que funciona, porque '+' are '' são codificados de forma diferente no final.Se você estiver usando jQuery, eu usaria o
$.param
método Sua URL codifica os campos de mapeamento de objetos para valores, que são mais fáceis de ler do que chamar um método de escape em cada valor.fonte
encodeURIComponent () é o caminho a percorrer.
Mas você deve ter em mente que existem pequenas diferenças em relação à versão php
urlencode()
e, como o @CMS mencionou, ele não codifica todos os caracteres. Os caras em http://phpjs.org/functions/urlencode/ fizeram js equivalentes aphpencode()
:fonte
Para codificar uma URL, como já foi dito anteriormente, você tem duas funções:
e
A razão pela qual ambos existem é que o primeiro preserva a URL com o risco de deixar muitas coisas sem escape, enquanto o segundo codifica tudo o que é necessário.
Com o primeiro, você poderia copiar o URL recém-escapado na barra de endereços (por exemplo) e ele funcionaria. No entanto, seus '&' sem escape interfeririam com os delimitadores de campo, os '=' interfeririam nos nomes e valores dos campos, e os '+' pareceriam espaços. Mas para dados simples quando você deseja preservar a natureza da URL do que está escapando, isso funciona.
O segundo é tudo o que você precisa fazer para garantir que nada em sua string interfira com um URL. Ele deixa vários caracteres sem importância sem escape, para que o URL permaneça o mais legível possível por humanos, sem interferência. Um URL codificado dessa maneira não funcionará mais como um URL sem desmarcá-lo.
Portanto, se você puder dedicar algum tempo, sempre desejará usar encodeURIComponent () - antes de adicionar pares nome / valor, codifique o nome e o valor usando essa função antes de adicioná-lo à string de consulta.
Estou tendo dificuldades para encontrar razões para usar o encodeURI () - deixarei isso para as pessoas mais inteligentes.
fonte
Tipo semelhante de coisa que tentei com javascript normal
fonte
Maneira elegante
Na minha humilde opinião, a maneira mais elegante de codificar parâmetros de consulta é criar um objeto com parâmetros como
e codifique-o usando:
conforme mencionado nesta resposta: https://stackoverflow.com/a/53171438/7284582
fonte
Para evitar a codificação dupla, é uma boa idéia decodificar o URL antes da codificação (se você estiver lidando com URLs inseridos pelo usuário, por exemplo, que já podem estar codificados).
Vamos dizer que temos
abc%20xyz 123
como entrada (um espaço já está codificado):fonte
O que é codificação de URL:
Um URL deve ser codificado quando houver caracteres especiais localizados dentro do URL. Por exemplo:
Podemos observar neste exemplo que todos os caracteres, exceto a string,
notEncoded
são codificados com sinais de%. A codificação de URL também é conhecida como porcentagem porque escapa a todos os caracteres especiais com um%. Depois deste sinal de%, cada caractere especial possui um código únicoPor que precisamos de codificação de URL:
Certos caracteres têm um valor especial em uma string de URL. Por exemplo, o? caractere indica o início de uma string de consulta. Para localizar com êxito um recurso na Web, é necessário distinguir entre quando um caractere é feito como parte de uma string ou parte da estrutura do URL.
Como podemos obter a codificação de URL em JS:
O JS oferece várias funções de construção na utilidade que podemos usar para codificar facilmente URLs. Estas são duas opções convenientes:
encodeURIComponent()
: Utiliza um componente de um URI como argumento e retorna a sequência de caracteres codificada do URI.encodeURI()
: Usa um URI como argumento e retorna a sequência de caracteres codificada do URI.Exemplo e advertências:
Esteja ciente de não passar todo o URL (incluindo o esquema, por exemplo, https: //)
encodeURIComponent()
. Na verdade, isso pode transformá-lo em um URL não funcional. Por exemplo:Podemos observar se colocamos toda a URL em
encodeURIComponent
que as barras (/) também são convertidas em caracteres especiais. Isso fará com que o URL não funcione mais corretamente.Portanto (como o nome indica) use:
encodeURIComponent
em uma determinada parte de um URL que você deseja codificar.encodeURI
em um URL inteiro que você deseja codificar.fonte
Nada funcionou para mim. 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 a mesma solicitação do Ajax carregando a página de login dentro de outra solicitação do Ajax, que deveria ser um redirecionamento, e não um carregamento simples texto da página de login).
No controlador de login, adicionei esta linha:
E no manipulador global do Ajax, fiz o seguinte:
Agora não tenho nenhum problema e funciona como um encanto.
fonte
Codificar URL String
fonte
Aqui está uma demonstração ao vivo de
encodeURIComponent()
edecodeURIComponent()
JS construídos em funções:fonte
Você pode usar a biblioteca esapi e codificar seu URL usando a função abaixo. A função garante que '/' não seja perdido na codificação enquanto o restante do conteúdo do texto é codificado:
https://www.owasp.org/index.php/ESAPI_JavaScript_Readme
fonte
Use a
fixedEncodeURIComponent
função para cumprir rigorosamente a RFC 3986 :fonte
Você não deve usar
encodeURIComponent()
diretamente.Dê uma olhada no RFC3986: URI (Uniform Resource Identifier): Sintaxe genérica
Esses caracteres reservados da definição de URI no RFC3986 NÃO são ignorados
encodeURIComponent()
.Documentos da Web MDN: encodeURIComponent ()
Use a função MDN Web Docs ...
fonte