¿Cómo codifica de manera segura una URL usando JavaScript de modo que pueda colocarse en una cadena GET?
var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;
¿Asumo que necesitas codificar la myUrl
variable en esa segunda línea?
javascript
url
urlencode
nickf
fuente
fuente
Respuestas:
Consulte la función incorporada encodeURIComponent (str) y encodeURI (str) .
En su caso, esto debería funcionar:
fuente
escape
También es una opción válida.encodeURI
no es realmente seguro para la codificación de URL.:
,/
,@
etc., no deben ser utilizados intercambiables Estos 2 métodos, debe saber lo que está codificando para usar el método correcto.Tienes tres opciones:
escape()
no codificará:@*/+
encodeURI()
no codificará:~!@#$&*()=:/,;?+'
encodeURIComponent()
no codificará:~!*()'
Pero en su caso, si desea pasar una URL a un
GET
parámetro de otra página, debe usarescape
oencodeURIComponent
, pero noencodeURI
.Consulte la pregunta sobre desbordamiento de pila. Práctica recomendada: escape, o encodeURI / encodeURIComponent para obtener más información.
fuente
%uxxx
.Quédate con
encodeURIComponent()
. La funciónencodeURI()
no se molesta en codificar muchos caracteres que tienen importancia semántica en las URL (por ejemplo, "#", "?" Y "&").escape()
está en desuso y no se molesta en codificar caracteres "+", que se interpretarán como espacios codificados en el servidor (y, como han señalado otros aquí, no codifica correctamente los caracteres que no son ASCII).Hay una buena explicación de la diferencia entre
encodeURI()
y enencodeURIComponent()
otros lugares. Si desea codificar algo para que pueda incluirse de forma segura como un componente de un URI (por ejemplo, como un parámetro de cadena de consulta), desea utilizarloencodeURIComponent()
.fuente
La mejor respuesta es el uso
encodeURIComponent
de los valores en la cadena de consulta (y ningún otro lugar).Sin embargo, creo que muchas API quieren reemplazar "" con "+", así que tuve que usar lo siguiente:
escape
se implementa de manera diferente en diferentes navegadores yencodeURI
no codifica muchos caracteres (como # e incluso /); está hecho para usarse en un URI / URL completo sin romperlo, lo que no es muy útil ni seguro.Y como @Jochem señala a continuación, es posible que desee usar
encodeURIComponent()
en un (cada) nombre de carpeta, pero por alguna razón, estas API no parecen querer+
en los nombres de carpeta, por lo que los viejosencodeURIComponent
funcionan muy bien.Ejemplo:
fuente
http://somedomain/this dir has spaces/info.php?a=this has also spaces
. Debería convertirse a:http://somedomain/this%20dir%20has%spaces/info.php?a=this%20has%20also%20spaces
pero muchas implementaciones permiten que '% 20' en la cadena de consulta se reemplace por '+'. Sin embargo, no puede reemplazar '% 20' con '+' en la sección de ruta de la URL, esto dará como resultado un error No encontrado a menos que tenga un directorio con+
un espacio en lugar de un espacio.encodeURIComponent('+')
te daría%2B
, así que tendrías que usar dos expresiones regulares ... lo que supongo es un poco por qué esto funciona, porque '+' son '' están codificadas de manera diferente al final.Si está utilizando jQuery, iría por el
$.param
método. Su URL codifica los campos de asignación de objetos a valores, lo que es más fácil de leer que llamar a un método de escape en cada valor.fuente
encodeURIComponent () es el camino a seguir.
PERO debe tener en cuenta que existen pequeñas diferencias con respecto a la versión de php
urlencode()
y, como se mencionó en @CMS, no codificará todos los caracteres. Chicos en http://phpjs.org/functions/urlencode/ hicieron js equivalente aphpencode()
:fuente
Para codificar una URL, como se ha dicho antes, tiene dos funciones:
y
La razón por la que ambos existen es que el primero conserva la URL con el riesgo de dejar demasiadas cosas sin escapar, mientras que el segundo codifica todo lo necesario.
Con el primero, podría copiar la URL recién escapada en la barra de direcciones (por ejemplo) y funcionaría. Sin embargo, sus '&' sin escape interferirían con los delimitadores de campo, los '=' interferirían con los nombres y valores de campo, y los '+' se verían como espacios. Pero para datos simples cuando desea preservar la naturaleza de URL de lo que está escapando, esto funciona.
El segundo es todo lo que necesita hacer para asegurarse de que nada en su cadena interfiera con una URL. Deja varios caracteres sin importancia sin escapes para que la URL permanezca lo más legible posible sin interferencia. Una URL codificada de esta manera ya no funcionará como una URL sin desescaparla.
Entonces, si puede tomarse el tiempo, siempre desea usar encodeURIComponent (), antes de agregar pares de nombre / valor codifique tanto el nombre como el valor usando esta función antes de agregarlo a la cadena de consulta.
Me está costando trabajo encontrar razones para usar el encodeURI (). Se lo dejaré a las personas más inteligentes.
fuente
Tipo similar de cosas que probé con javascript normal
fuente
Manera elegante
En mi humilde opinión, la forma más elegante de codificar parámetros de consulta es crear un objeto con parámetros como
y luego codificarlo usando:
como se menciona en esta respuesta: https://stackoverflow.com/a/53171438/7284582
fuente
Para evitar la doble codificación, es una buena idea decodificar la url antes de codificar (si se trata de URL ingresadas por el usuario, por ejemplo, que podrían estar ya codificadas).
Digamos que tenemos
abc%20xyz 123
como entrada (un espacio ya está codificado):fuente
Qué es la codificación de URL:
Se debe codificar una URL cuando hay caracteres especiales ubicados dentro de la URL. Por ejemplo:
En este ejemplo, podemos observar que todos los caracteres, excepto la cadena,
notEncoded
están codificados con signos%. La codificación URL también se conoce como codificación porcentual porque escapa a todos los caracteres especiales con un%. Luego, después de este signo%, cada carácter especial tiene un código único¿Por qué necesitamos la codificación de URL?
Ciertos caracteres tienen un valor especial en una cadena URL. Por ejemplo, el? El carácter indica el comienzo de una cadena de consulta. Para localizar con éxito un recurso en la web, es necesario distinguir cuándo un carácter se entiende como parte de una cadena o parte de la estructura de la URL.
¿Cómo podemos lograr la codificación de URL en JS:
JS ofrece un montón de funciones de utilidad incorporadas que podemos usar para codificar fácilmente las URL. Estas son dos opciones convenientes:
encodeURIComponent()
: Toma un componente de un URI como argumento y devuelve la cadena de URI codificada.encodeURI()
: Toma un URI como argumento y devuelve la cadena de URI codificada.Ejemplo y advertencias:
Tenga en cuenta que no debe pasar toda la URL (incluido el esquema, por ejemplo, https: //) a
encodeURIComponent()
. En realidad, esto puede transformarlo en una URL no funcional. Por ejemplo:Podemos observar si ponemos la URL completa en
encodeURIComponent
que las barras diagonales (/) también se convierten en caracteres especiales. Esto hará que la URL ya no funcione correctamente.Por lo tanto (como su nombre lo indica) use:
encodeURIComponent
en una determinada parte de una URL que desea codificar.encodeURI
en una URL completa que desea codificar.fuente
Nada me funcionó. Todo lo que estaba viendo era el HTML de la página de inicio de sesión, volviendo al lado del cliente con el código 200. (302 al principio pero la misma solicitud de Ajax cargando la página de inicio de sesión dentro de otra solicitud de Ajax, que se suponía que era una redirección en lugar de cargarla sin formato texto de la página de inicio de sesión).
En el controlador de inicio de sesión, agregué esta línea:
Y en el controlador global de Ajax, hice esto:
Ahora no tengo ningún problema, y funciona de maravilla.
fuente
Codificar cadena de URL
fuente
Aquí hay una demostración en vivo de JS
encodeURIComponent()
ydecodeURIComponent()
funciones incorporadas:fuente
Puede usar la biblioteca esapi y codificar su url usando la siguiente función. La función asegura que '/' no se pierda en la codificación mientras que el resto del contenido del texto está codificado:
https://www.owasp.org/index.php/ESAPI_JavaScript_Readme
fuente
Utilice la
fixedEncodeURIComponent
función para cumplir estrictamente con RFC 3986 :fuente
No deberías usarlo
encodeURIComponent()
directamente.Eche un vistazo a RFC3986: Identificador uniforme de recursos (URI): sintaxis genérica
Estos caracteres reservados de la definición de URI en RFC3986 NO SE ESCAPAN
encodeURIComponent()
.Documentos web de MDN: encodeURIComponent ()
Use la función MDN Web Docs ...
fuente