1456 votes

Meilleure pratique: la fuite, ou encodeURI / encodeURIComponent

Lors de l'encodage d'une chaîne de requête à être envoyée à un serveur web - quelle est la meilleure pratique pour l'utilisation de javascript:

L'utilisation d'échappement:

escape("% +&=");

OU

utilisation encodeURI() / encodeURIComponent()

encodeURI("http://www.google.com?var1=value1&var2=value2");

encodeURIComponent("var1=value1&var2=value2");

1969voto

Arne Evertsson Points 11286

escape()

Ne l'utilisez pas, comme il a été abandonné depuis ECMAScript v3.

encodeURI()

Utilisation encodeURI lorsque vous voulez un travail d'URL. Faire cet appel:

encodeURI("http://www.google.com/a file with spaces.html")

pour obtenir:

http://www.google.com/a%20file%20with%20spaces.html

Ne l'appelez pas encodeURIComponent car il détruirait l'URL et retour

http%3A%2F%2Fwww.google.com%2Fa%20file%20with%20spaces.html

encodeURIComponent()

Utilisation encodeURIComponent si vous voulez encoder un paramètre de l'URL.

param1 = encodeURIComponent("http://xyz.com/?a=12&b=55")

Vous pouvez ensuite créer l'URL que vous avez besoin de:

url = "http://domain.com/?param1=" + param1 + "&param2=99";

Et vous obtiendrez cette URL:

http://www.domain.com/?param1=http%3A%2F%2Fxyz.com%2F%Ffa%3D12%26b%3D55&param2=99

Notez que encodeURIComponent ne pas échapper le caractère'. D'un commun bug est de l'utiliser pour créer des attributs html comme href='MyUrl', ce qui pourrait souffrir d'une injection de bug. Si vous êtes à la construction de html à partir de chaînes de caractères, soit utiliser "au lieu de" pour l'attribut cite, ou ajouter une couche supplémentaire de codage ("peut être codé en %27).

Pour plus d'informations sur ce type de codage, vous pouvez vérifier: http://en.wikipedia.org/wiki/Percent-encoding

467voto

Johann Echavarria Points 798

La différence entre encodeURI et encodeURIComponent sont exactement 11 caractères encodés par encodeURIComponent mais pas par encodeURI:

Table with the ten differences between encodeURI and encodeURIComponent

J'ai généré ce tableau facilement avec la console.table en Chrome de Google avec ce code:

var arr=[];
for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char))  {arr.push({character:char,encodeURI:encodeURI(char),encodeURIComponent:encodeURIComponent(char)})}
}
console.table(arr);

47voto

Damien Points 1151

J'ai trouvé cet article instructif : Javascript Folie: L'Analyse De La Chaîne De Requête

Je l'ai trouvé quand j'ai essayé de comprendre pourquoi decodeURIComponent a pas de décodage '+' correctement. Voici un extrait:

String:                         "A + B"
Expected Query String Encoding: "A+%2B+B"
escape("A + B") =               "A%20+%20B"     Wrong!
encodeURI("A + B") =            "A%20+%20B"     Wrong!
encodeURIComponent("A + B") =   "A%20%2B%20B"   Acceptable, but strange

Encoded String:                 "A+%2B+B"
Expected Decoding:              "A + B"
unescape("A+%2B+B") =           "A+++B"       Wrong!
decodeURI("A+%2B+B") =          "A+++B"       Wrong!
decodeURIComponent("A+%2B+B") = "A+++B"       Wrong!

40voto

encodeURIComponent ne pas coder -_.!~*'(), causant un problème dans l'affichage des données de php dans la chaîne xml.

Par exemple:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>

Général échapper encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E

Vous pouvez le voir, l'apostrophe n'est pas codé. Pour résoudre le problème, j'ai créé deux fonctions pour résoudre des problème dans mon projet, pour le Codage d'URL:

function encodeData(s:String):String{
    return encodeURIComponent(s).replace(/\-/g, "%2D").replace(/\_/g, "%5F").replace(/\./g, "%2E").replace(/\!/g, "%21").replace(/\~/g, "%7E").replace(/\*/g, "%2A").replace(/\'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29");
}

Pour le Décodage URL:

function decodeData(s:String):String{
    try{
        return decodeURIComponent(s.replace(/\%2D/g, "-").replace(/\%5F/g, "_").replace(/\%2E/g, ".").replace(/\%21/g, "!").replace(/\%7E/g, "~").replace(/\%2A/g, "*").replace(/\%27/g, "'").replace(/\%28/g, "(").replace(/\%29/g, ")"));
    }catch (e:Error) {
    }
    return "";
}

36voto

Daniel Papasian Points 10206

encodeURI() - la fonction escape() est pour le javascript s'échapper, pas HTTP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X