web-dev-qa-db-fra.com

Certains clients de messagerie utilisent-ils automatiquement les chaînes% 2b urldecode?

Nous avons un processus de vérification d'adresse e-mail sur notre site Web. Le site génère d'abord une clé appropriée sous forme de chaîne

mykey

Il code ensuite cette clé comme un tas d'octets

&$dac~ʌ����!

Il base ensuite en code ce groupe d'octets

JiRkYWN+yoyIhIQ==

Puisque cette clé sera donnée comme valeur de chaîne de requête d'une URL à placer dans un email HTML, nous devons d'abord URLEncode puis HTMLEncode le résultat, ce qui nous donne (il n'y a aucun effet de HTMLEncoding ici, mais je peux pas la peine de retravailler l’exemple)

JiRkYWN%2ByoyIhIQ%3D%3D

Ceci est ensuite intégré au HTML qui est envoyé dans le cadre d'un email, quelque chose comme:

click <a href="http://myapp/verify?key=JiRkYWN%2ByoyIhIQ%3D%3D">here</a>. 
Or paste <b>http://myapp/verify?key=JiRkYWN%2ByoyIhIQ%3D%3D</b> into your browser.

Lorsque l'utilisateur destinataire clique sur le lien, le site reçoit la demande, extrait la valeur du paramètre "clé" de chaîne de requête, la base64 le décode, le décrypte et fait ce qui convient en termes de logique du site.

Cependant Nous avons parfois des utilisateurs qui signalent que leur clic est inefficace. Un de ces utilisateurs nous a transmis le courrier électronique qui lui avait été envoyé et, lors de l'inspection, le code HTML a été transformé en (pour le dire à l'aide de l'exemple ci-dessus)

click <a href="http://myapp/verify?key=JiRkYWN+yoyIhIQ%3D%3D">here</a>
Or paste <b>http://myapp/verify?key=JiRkYWN+yoyIhIQ%3D%3D</b> into your browser.

C'est-à-dire que la chaîne% 2B - mais aucune des autres chaînes codées en pourcentage - n'a été convertie en un plus.

key=JiRkYWN%2ByoyIhIQ%3D%3D
key=JiRkYWN+yoyIhIQ%3D%3D

Je pense donc qu'il y a plusieurs possibilités:

  1. Je fais quelque chose de stupide que je ne peux pas voir, ou

  2. Certains clients de messagerie tentent de résoudre le problème des personnes, par erreur, en codant plus de signes URLEncoding en les convertissant de manière "utile".

En cas de 1 - qu'est-ce que c'est? Dans le cas de 2 - quels clients mail? Ou bien, existe-t-il un moyen standard connu de gérer ce type de scénario?

Un grand merci pour toute aide

2
Yellowfog

Il semble que vous encodiez correctement. Je conviens qu'un client de messagerie fait quelque chose de génial.

Voici quelques approches que vous pouvez essayer:

Remplacer les espaces dans la clé

Un plus dans l'URL aura l'URL décodé dans un espace. Lorsque votre serveur Web obtient le paramètre "clé", faites-le remplacer les espaces par des plus. Cela pourrait réparer les clés pour qu'elles puissent être lues.

Utilisez des caractères différents pour le codage Base64

Au lieu d'utiliser + et =, essayez deux symboles différents pour le codage en base64, tels que . et -, qui sont plus sûrs dans le contexte des URL et des paramètres. Cela nécessiterait que vous modifiiez ou enveloppiez votre encodeur base64.

Passer au codage hexadécimal

Le codage hexadécimal utilise uniquement des chiffres et les lettres a quoique f. Les chaînes codées en hexadécimal seront plus longues que les chaînes codées en base64, mais il semblerait que vos chaînes soient assez courtes et que cela ne ferait pas beaucoup de différence dans ce cas.

Ne pas encoder vos clés du tout

Lorsque j'écris un processus de vérification de courrier électronique, mon serveur génère une chaîne de lettres et de chiffres communs que je peux coller dans un paramètre d'URL sans codage. L'algorithme permettant de le faire ressemble à ceci:

array alphabet=['a','b','c',...'A','B','C',...'0','1','2'...]
string key=""
for 0 to desired_key_length
    key += alphabet[random(alphabet.length)]
2