Comment encoder une URL en toute sécurité à l'aide de JavaScript de manière à ce qu'elle puisse être placée dans une chaîne GET?
var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;
Je suppose que vous devez coder la myUrl
variable sur cette deuxième ligne?
javascript
url
urlencode
nickf
la source
la source
Réponses:
Découvrez la fonction intégrée encodeURIComponent (str) et encodeURI (str) .
Dans votre cas, cela devrait fonctionner:
la source
escape
est également une option valide.encodeURI
n'est pas vraiment sûr pour le codage d'URL.:
,/
,@
etc. Ces 2 méthodes ne sont pas interchangeables à utiliser, vous devez savoir ce que vous encodez à utiliser la bonne méthode.Vous avez trois options:
escape()
ne codera pas:@*/+
encodeURI()
ne codera pas:~!@#$&*()=:/,;?+'
encodeURIComponent()
ne codera pas:~!*()'
Mais dans votre cas, si vous souhaitez passer une URL dans un
GET
paramètre d'une autre page, vous devez utiliserescape
ouencodeURIComponent
, mais pasencodeURI
.Voir la question Stack Overflow Best practice: escape, ou encodeURI / encodeURIComponent pour une discussion plus approfondie.
la source
%uxxx
.Restez avec
encodeURIComponent()
. La fonctionencodeURI()
ne prend pas la peine de coder de nombreux caractères qui ont une importance sémantique dans les URL (par exemple "#", "?" Et "&").escape()
est obsolète et ne prend pas la peine de coder les caractères "+", qui seront interprétés comme des espaces codés sur le serveur (et, comme d'autres l'ont souligné ici, ne codent pas correctement les caractères non ASCII par URL).Il y a une belle explication de la différence entre
encodeURI()
etencodeURIComponent()
ailleurs. Si vous voulez coder quelque chose afin qu'il puisse être inclus en toute sécurité en tant que composant d'un URI (par exemple en tant que paramètre de chaîne de requête), vous voulez l'utiliserencodeURIComponent()
.la source
La meilleure réponse est d'utiliser
encodeURIComponent
sur des valeurs dans la chaîne de requête (et nulle part ailleurs).Cependant, je trouve que de nombreuses API veulent remplacer "" par "+", j'ai donc dû utiliser ce qui suit:
escape
est implémenté différemment dans différents navigateurs etencodeURI
n'encode pas beaucoup de caractères (comme # et même /) - il est fait pour être utilisé sur un URI / URL complet sans le casser - ce qui n'est pas super utile ou sécurisé.Et comme @Jochem le souligne ci-dessous, vous voudrez peut-être utiliser
encodeURIComponent()
un nom de dossier (pour chaque), mais pour une raison quelconque, ces API ne semblent pas vouloir+
figurer dans les noms de dossier, donc tout simplement vieuxencodeURIComponent
fonctionne très bien.Exemple:
la source
http://somedomain/this dir has spaces/info.php?a=this has also spaces
. Il doit être converti en:http://somedomain/this%20dir%20has%spaces/info.php?a=this%20has%20also%20spaces
mais de nombreuses implémentations permettent de remplacer «% 20» dans la chaîne de requête par «+». Néanmoins, vous ne pouvez pas remplacer '% 20' par '+' dans la section de chemin de l'URL, cela entraînera une erreur Introuvable sauf si vous avez un répertoire avec un+
au lieu d'un espace.encodeURIComponent('+')
, vous donnerait%2B
, vous devez donc utiliser deux expressions régulières ... ce qui, je suppose, est un peu pourquoi cela fonctionne, car '+' sont '' sont encodés différemment à la fin.Si vous utilisez jQuery, j'irais pour la
$.param
méthode. Son URL code un champ de mappage d'objet en valeurs, ce qui est plus facile à lire que d'appeler une méthode d'échappement sur chaque valeur.la source
encodeURIComponent () est la voie à suivre.
MAIS vous devez garder à l'esprit qu'il existe de petites différences par rapport à la version php
urlencode()
et comme @CMS l'a mentionné, il n'encodera pas tous les caractères. Les gars sur http://phpjs.org/functions/urlencode/ ont rendu js l'équivalent dephpencode()
:la source
Pour encoder une URL, comme cela a été dit précédemment, vous avez deux fonctions:
et
La raison pour laquelle les deux existent est que le premier préserve l'URL avec le risque de laisser trop de choses sans échapper, tandis que le second code tout ce qui est nécessaire.
Avec le premier, vous pouvez copier l'URL nouvellement échappée dans la barre d'adresse (par exemple) et cela fonctionnera. Cependant, vos «&» non échappés interféreraient avec les délimiteurs de champ, les «=» interféreraient avec les noms et les valeurs des champs et les «+» ressembleraient à des espaces. Mais pour les données simples lorsque vous souhaitez conserver la nature de l'URL de ce que vous échappez, cela fonctionne.
La seconde est tout ce que vous devez faire pour vous assurer que rien dans votre chaîne n'interfère avec une URL. Il laisse divers caractères sans importance échappés afin que l'URL reste aussi lisible que possible sans interférence. Une URL encodée de cette façon ne fonctionnera plus comme URL sans la déséchapper.
Donc, si vous pouvez prendre le temps, vous voulez toujours utiliser encodeURIComponent () - avant d'ajouter des paires nom / valeur, encodez à la fois le nom et la valeur en utilisant cette fonction avant de l'ajouter à la chaîne de requête.
J'ai du mal à trouver des raisons d'utiliser l'encodeURI () - je laisse cela aux gens les plus intelligents.
la source
Le même genre de chose que j'ai essayé avec du javascript normal
la source
Manière élégante
À mon humble avis, la façon la plus élégante d'encoder des paramètres de requête est de créer un objet avec des paramètres tels que
puis l'encode en utilisant:
comme mentionné dans cette réponse: https://stackoverflow.com/a/53171438/7284582
la source
Pour éviter le double encodage, c'est une bonne idée de décoder l'URL avant l'encodage (si vous traitez par exemple des URL saisies par l'utilisateur, qui peuvent déjà être encodées).
Disons que nous avons
abc%20xyz 123
en entrée (un espace est déjà encodé):la source
Qu'est-ce que le codage d'URL:
Une URL doit être codée lorsqu'il y a des caractères spéciaux à l'intérieur de l'URL. Par exemple:
On peut observer dans cet exemple que tous les caractères sauf la chaîne
notEncoded
sont encodés avec des signes%. L'encodage d'URL est également connu sous le nom d' encodage en pourcentage car il échappe à tous les caractères spéciaux avec un%. Ensuite, après ce signe%, chaque caractère spécial a un code uniquePourquoi avons-nous besoin d'un encodage URL:
Certains caractères ont une valeur spéciale dans une chaîne URL. Par exemple, le? Le caractère indique le début d'une chaîne de requête. Afin de localiser avec succès une ressource sur le Web, il est nécessaire de faire la distinction entre le moment où un caractère est censé faire partie d'une chaîne ou d'une partie de la structure d'URL.
Comment pouvons-nous réaliser le codage URL dans JS:
JS offre un tas de fonctions utilitaires intégrées que nous pouvons utiliser pour encoder facilement les URL. Ce sont deux options pratiques:
encodeURIComponent()
: Prend un composant d'un URI comme argument et retourne la chaîne URI codée.encodeURI()
: Prend un URI comme argument et renvoie la chaîne URI codée.Exemple et mises en garde:
N'oubliez pas de ne pas transmettre l'intégralité de l'URL (y compris le schéma, par exemple https: //) dans
encodeURIComponent()
. Cela peut en fait le transformer en une URL non fonctionnelle. Par exemple:Nous pouvons observer f nous avons mis l'URL entière dans
encodeURIComponent
la mesure où les barres obliques (/) sont également converties en caractères spéciaux. Cela entraînera l'URL de ne plus fonctionner correctement.Par conséquent (comme son nom l'indique), utilisez:
encodeURIComponent
sur une certaine partie d'une URL que vous souhaitez encoder.encodeURI
sur une URL entière que vous souhaitez encoder.la source
Rien n'a fonctionné pour moi. Tout ce que je voyais était le code HTML de la page de connexion, revenant du côté client avec le code 200. (302 au début, mais la même demande Ajax chargeant la page de connexion dans une autre demande Ajax, qui était censée être une redirection plutôt que de charger plain texte de la page de connexion).
Dans le contrôleur de connexion, j'ai ajouté cette ligne:
Et dans le gestionnaire global Ajax, j'ai fait ceci:
Maintenant, je n'ai aucun problème, et cela fonctionne comme un charme.
la source
Encoder la chaîne d'URL
la source
Voici une démo en direct de JS
encodeURIComponent()
et desdecodeURIComponent()
fonctions intégrées:la source
Vous pouvez utiliser la bibliothèque esapi et encoder votre URL en utilisant la fonction ci-dessous. La fonction garantit que «/» n'est pas perdu lors de l'encodage tandis que le reste du contenu du texte est encodé:
https://www.owasp.org/index.php/ESAPI_JavaScript_Readme
la source
Utilisez la
fixedEncodeURIComponent
fonction pour se conformer strictement à la RFC 3986 :la source
Vous ne devez pas utiliser
encodeURIComponent()
directement.Jetez un oeil à RFC3986: identificateur de ressource uniforme (URI): syntaxe générique
Ces caractères réservés de la définition d'URI dans RFC3986 NE SONT PAS échappés par
encodeURIComponent()
.Documents Web MDN: encodeURIComponent ()
Utilisez la fonction MDN Web Docs ...
la source