Question

J'essaie de transmettre une chaîne Base64 à une application Web C # .Net via QueryString. Lorsque la chaîne arrive, le " + " (plus) signe est remplacé par un espace. Il semble que le processus automatique URLDecode le fasse. Je n'ai aucun contrôle sur ce qui est transmis via QueryString. Existe-t-il un moyen de gérer ce côté serveur?

Exemple:

http://localhost:3399/Base64.aspx?VLTrap=VkxUcmFwIHNldCB0byAiRkRTQT8+PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

Produit:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

Des personnes ont suggéré de coder la chaîne de requête à l'aide d'URLEncoding:

System.Web.HttpUtility.UrlEncode(yourString) 

Je ne peux pas faire cela car je n'ai aucun contrôle sur la routine d'appel (ce qui fonctionne très bien avec d'autres langues).

Il a également été suggéré de remplacer les espaces par un signe plus:

Request.QueryString["VLTrap"].Replace(" ", "+");

Je pensais à cela, mais mon souci à ce sujet, et j'aurais dû le mentionner pour commencer, est que je ne sais pas quels autres caractères pourraient être mal formés en plus du signe plus.

Mon objectif principal est d'intercepter la chaîne QueryString avant qu'elle ne soit exécutée dans le décodeur.

À cette fin, j’ai essayé de regarder Request.QueryString.toString () mais cela contenait les mêmes informations malformées. Existe-t-il un moyen de regarder le QueryString brut avant qu'il soit URLDecoded?

Après des tests supplémentaires, il semble que .Net s’attende à ce que tout ce qui arrive de QuerString soit encodé en URL, mais que le navigateur ne code pas automatiquement les demandes GET.

Était-ce utile?

La solution

Vous pouvez remplacer manuellement la valeur ( argument.Replace (',,' + ') ) ou consulter le HttpRequest.ServerVariables [" QUERY_STRING &]] (même mieux le HttpRequest.Url.Query) et analysez-le vous-même.

Vous devriez cependant essayer de résoudre le problème où l'URL est donnée; un signe plus doit être codé sous la forme "% 2B " dans l'URL car un plus représente sinon un espace.

Si vous ne contrôlez pas les URL entrantes, la première option est préférable car vous évitez le plus d'erreurs de cette façon.

Autres conseils

La solution proposée:

Request.QueryString["VLTrap"].Replace(" ", "+");

Devrait bien fonctionner. En ce qui concerne votre préoccupation:

  

J'y avais pensé, mais mon souci, et j'aurais dû le dire pour commencer, est que je ne sais pas quels autres personnages pourraient être malformés en plus du signe plus.

Cela est facile à résoudre en en savoir plus sur base64 . Les seuls caractères non alphanumériques autorisés par Base64 moderne sont "/", "+". et " = " (qui n’est utilisé que pour le remplissage).

Parmi ceux-ci, " + " est le seul qui a une signification particulière en tant que représentation échappée dans les URL. Alors que les deux autres ont une signification particulière dans les URL (séparateur de chemin et séparateur de chaîne de requête), ils ne devraient pas poser de problème.

Je pense donc que vous devriez aller bien.

Je rencontre exactement le même problème, sauf que je contrôle mon URL. Même avec Server.URLDecode et Server.URLEncode , il ne le reconvertit pas en signe + , même si ma chaîne de requête ressemble à ce qui suit. :

http://localhost/childapp/default.aspx?TokenID=0XU%2fKUTLau%2bnSWR7%2b5Z7DbZrhKZMyeqStyTPonw1OdI%3d

Lorsque j'effectue les tâches suivantes.

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);

il ne convertit toujours pas le % 2b en un signe + . Au lieu de cela, je dois procéder comme suit:

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);
tokenID = tokenID.Replace(" ", "+");

Ensuite, cela fonctionne correctement. Vraiment étrange.

J'ai eu un problème similaire avec un paramètre qui contient la valeur Base64 et quand il vient avec '+'. Uniquement Request.QueryString ["VLTrap"]. Replace ("", "+"); a bien fonctionné pour moi; aucun UrlEncode ou autre codage aidant car même si vous montrez vous-même un lien codé sur la page avec un '+' codé en tant que '% 2b', son navigateur le change d'abord en '+' quand il s'affiche et que vous cliquez dessus, puis le navigateur change il vider l'espace. Donc, aucun moyen de le contrôler comme l'affiche d'origine dit même si vous montrez des liens vous-même Même chose avec ces liens, même dans les emails en HTML.

Si vous URLEncode la chaîne avant de l'ajouter à l'URL, vous ne rencontrerez aucun de ces problèmes (le code automatique URLDecode le remettra à son état d'origine).

Eh bien, vous devriez évidemment avoir la chaîne Base64 URLEncoded avant de l'envoyer au serveur.
Si vous ne pouvez pas accomplir cela, je suggérerais simplement de remplacer tous les espaces incorporés par +; comme les chaînes b64 ne sont pas supposées avoir des espaces, c’est une tactique légitime ...

System.Web.HttpUtility.UrlEncode (yourString) fera l'affaire.

Comme solution rapide, vous pouvez remplacer l’espace par un caractère plus avant le décodage en base64.

Si vous utilisez System.Uri.UnescapeDataString (yourString) , le + sera ignoré. Cette méthode ne doit être utilisée que dans des cas comme le vôtre, lorsque la chaîne a été codée en utilisant une sorte d’approche héritée sur le client ou sur le serveur.

Voir cet article de blog: http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx

Je ne suis en aucun cas un développeur C #, mais il semble que vous ayez besoin d’URL ENCODEER votre chaîne Base64 avant de l’envoyer sous forme d’URL.

Ne pouvez-vous pas simplement supposer qu'un espace est un + et le remplacer?

Request.QueryString["VLTrap"].Replace(" ", "+");

;)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top