2010-10-16 4 views
0

J'écris une fonction JavaScript qui doit respecter trois propriétés:entrée utilisateur encodage en tant que paramètre URL GET JavaScript

  • très petit et léger - pas de bibliothèques externes
  • encode une chaîne telle une de manière à pouvoir être transmis en tant que paramètre GET
  • cette chaîne doit être décodé à nouveau à destination

efficacement, il authentifie l'utilisateur en envoyant son nom d'utilisateur et p assword à une page PHP qui le vérifie ensuite. Ceci est fait via GET parce que je n'ai pas encore trouvé un moyen de faire une requête POST interdomaine de fond. Le problème est que si l'utilisateur a un caractère tel que "#" ou similaire dans son mot de passe, il n'est pas envoyé correctement.

Actuellement pour éviter cela, je encode() la chaîne de mot de passe avant de l'envoyer, ce qui lui permet d'être reçu sans problèmes. Cependant, j'ai lu que urldecode() de PHP n'est pas un analogue parfait pour ceci, car il y a des cas d'angle qui sont traités différemment (c'est-à-dire '', '+', etc.). Malheureusement, je ne peux plus trouver ce document, donc je ne peux pas le citer, mais l'essentiel était que l'un d'eux convertit les espaces en signes '+', que l'autre traite comme un signe plus ou plus ...

En tant que tel, je suis à la recherche d'une fonction Javascript qui peut prendre une chaîne et la rendre sûre pour les URL, et qui a une fonction d'inversion parfaite en PHP pour que la chaîne d'origine puisse être récupérée.

Le code sans doute pire que j'utilise actuellement pour y parvenir:

login.onsubmit = function(){ 
    loginFailMsg.style.display = 'none'; 
    var inputs = login.getElementsByTagName('input'); 
    var formdata = 
     'username='+inputs[0].value+'&password='+encode(inputs[1].value); 
    submit.src = formtarget+'/auth/bklt?'+formdata; 
    userinfo = undefined; 
    setTimeout(getUserinfo,300); 
    return false; 
}; 
+0

Maintenant que vous avez mentionné qu'il y a une très bonne raison pour GET, pourquoi ne pas supprimer cette phrase et simplement partager cette raison avec nous? Curieuse! – Arjan

+0

Et, il y a trop de bruit dans votre question!Si vous ne voulez pas MD5 (comme vous avez commenté à la réponse de Karl), alors pourquoi le mentionner, et pourquoi ne pas supprimer l'ensemble du hachage du titre? – Arjan

+0

@Arjan: Toutes mes excuses pour le bruit, je ne suis pas très doué pour m'exprimer moi-même = P J'adorerais md5 si je pouvais l'utiliser, mais ce dont j'ai vraiment besoin, c'est quelque chose de construit en javascript. – Mala

Répondre

1
'&password='+encode(inputs[1].value) 

Où est encode fonction vient? Semble à moi la réponse rapide à votre question utilise à la place encodeURIComponent(), disponible depuis JavaScript 1.5. Voir également Comparing escape(), encodeURI(), and encodeURIComponent(); il n'encode pas tout non plus, mais code tout ce que le serveur attend de lui.

(Comme pour les appels inter-domaines AJAX POST, je voudrais vraiment jeter un oeil à « JSON avec padding ». Vous voyez JSONP with jQuery que je l'ai mentionné dans les commentaires plus tôt. Cela permettra également d'éviter des problèmes avec le timeout que vous avez au hasard choisi, et jQuery vous aidera également, beaucoup, pour se débarrasser de inputs[0].value et ainsi de suite Et, comme vous apparently avez déjà un hachage MD5 sur le serveur, je voudrais vraiment hachage le côté client de mot de passe - voir Karl's answer - et comparez ces hachages à la place Respectez le mot de passe de votre utilisateur et votre propre temps, laissez tomber aucune bibliothèque externe exigence!)

+0

en utilisant escape, le # n'est pas un problème ... c'est juste urldecode de php ne produit pas l'entrée exacte. Il y a quelques cas de coin (je voudrais pouvoir me rappeler où j'ai lu ceci) impliquant '', '+', et quelques autres caractères – Mala

+0

@Mala, mais pourquoi utiliser escape? Mon point est: pas nécessaire! – Arjan

+0

Oh, puisque vous n'utilisez pas '

', je suppose? Les navigateurs modernes supportent également 'encodeURI' et autres, mais je suppose que' escape 'devrait vous donner le même résultat qu'un' '. – Arjan

1

Je ne pense pas qu'il y ait une telle chose en fonction de hachage réversible. Il y a beaucoup de javascript md5 libraries disponibles, cependant.

+0

excuses, je me suis trompé - en l'absence de MD5 je cherche une sorte de la traduction, ie base64 ou quelque chose ... fondamentalement quelque chose qui va s'assurer qu'il est passé correctement au script – Mala

Questions connexes