QueryString malformés après URLDecode
Je suis en train de passer une chaîne en Base64 C#.Net application web via la chaîne de Requête. Lorsque la chaîne arrive le "+" (plus) signe est remplacé par un espace. Il semble que l'automatique URLDecode processus est en train de faire cela. Je n'ai aucun contrôle sur ce qui est transmis par la chaîne de Requête. Est-il possible de gérer ce serveur?
Exemple:
http://localhost:3399/Base64.aspx?VLTrap=VkxUcmFwIHNldCB0byAiRkRTQT8+PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==
Produit:
VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==
De gens ont suggéré Encodage de la querystring:
System.Web.HttpUtility.UrlEncode(yourString)
Je ne peux pas le faire car je n'ai pas de contrôle sur l'appel de la routine (qui fonctionne bien avec d'autres langues).
Il y a aussi la suggestion de remplacer les espaces par un signe plus:
Request.QueryString["VLTrap"].Replace(" ", "+");
J'ai eu bien de cela, mais mon souci avec elle, et je devrais avoir parlé à démarrer, c'est que je ne sais pas ce que autres caractères risquent d'être mal formé, en plus du signe plus.
Mon objectif principal est d'intercepter la chaîne de Requête avant de l'exécuter via le décodeur.
À cette fin, j'ai essayé de regarder à la Demande.QueryString.toString (), mais cette contenaient la même incorrect de l'information. Est-il possible de regarder le raw QueryString avant il est URLDecoded?
Après d'autres tests, il semble que .Net s'attend à tout venant de la QuerString être codées dans l'URL, mais le navigateur ne prend pas automatiquement les encoder les requêtes GET.
OriginalL'auteur pdavis | 2008-09-23
Vous devez vous connecter pour publier un commentaire.
Vous pourriez remplacer manuellement la valeur (
argument.Replace(' ', '+')
) ou consulter leHttpRequest.ServerVariables["QUERY_STRING"]
(encore mieux HttpRequest.Url.Requête) et d'analyser vous-même.Cependant, tu devrais essayer de résoudre le problème lorsque l'URL est donné; un signe plus besoin d'obtenir codé comme "%2B" dans l'URL, car un plus sinon représente un espace.
Si vous n'avez pas de contrôle sur les entrants Url, la première option serait préférable que vous éviter la plupart des erreurs de cette façon.
OriginalL'auteur Troels Thomsen
La solution suggérée:
Devrait fonctionner parfaitement. Comme pour votre préoccupation:
C'est facile de les atténuer par la lecture sur base64. Les seuls caractères non alphanumériques qui sont d'ordre juridique moderne base64 sont des "/", "+" et "=" (qui est seulement utilisée pour le rembourrage).
De ceux, "+" est le seul qui a une signification spéciale, comme une fuite de la représentation dans les Url. Tandis que les deux autres ont une signification spéciale dans les URLs (délimiteur de chemin et de chaîne de requête séparateur), ils ne devraient pas poser un problème.
Donc je pense que vous devriez être OK.
OriginalL'auteur Tim Farley
J'ai exactement le même problème sauf que j'ai le contrôle sur mon URL. Même avec
Server.URLDecode
etServer.URLEncode
il n'a pas le reconvertir en un+
signe, même si ma chaîne de requête se présente comme suit:Quand j'ai effectuer les opérations suivantes.
cela ne fonctionne toujours pas convertir le
%2b
de retour dans une+
signe. Au lieu de cela, je dois faire ce qui suit:Alors qu'il fonctionne correctement. Vraiment étrange.
Request.QueryString["TokenID"]
retourne déjà URLdecoded chaîne. En la passant à Serveur.UrlDecode vous faire urldecoding deux fois.OriginalL'auteur Oaresome
J'ai eu le même problème avec un paramètre qui contient Base64 valeur et quand il est livré avec un '+'.
Seulement Demande.QueryString["VLTrap"].Replace(" ", "+"); a bien fonctionné pour moi;
pas de UrlEncode ou autre encodage aider parce que même si vous montrez codé lien sur la page vous-même avec un '+' codé comme un '%2b' alors c'est le navigateur qui change '+' au début, quand il showen et lorsque vous cliquez dessus puis navigateur changements à vide de l'espace. Donc aucun moyen de le contrôler comme à l'origine de l'affiche dit, même si vous montre les liens vous-même. La même chose avec ces liens, même dans les e-mails html.
OriginalL'auteur Roman Lazunin
Si vous URLEncode la chaîne avant de l'ajouter à l'URL que vous n'aurez pas un de ces problèmes (l'automatique URLDecode sera de retour à l'état initial).
OriginalL'auteur Nir
Eh bien, évidemment, vous devriez avoir le Base64 chaîne URLEncoded avant de les envoyer au serveur.
Si vous ne pouvez pas accomplir cela, je suggère simplement de remplacer tous les espaces incorporés dos à +; depuis b64 chaînes ne sont pas suposed d'avoir des espaces, son légitime tactique...
D'où l'évidence... et les autres par la suite.
OriginalL'auteur AviD
System.Web.HttpUtility.UrlEncode(yourString)
fera l'affaire.OriginalL'auteur henriksen
Rapide hack vous pouvez remplacer l'espace avec plus de caractère avant base64-décodage.
OriginalL'auteur Alexander
Si vous utilisez
System.Uri.UnescapeDataString(yourString)
il ignore le+
. Cette méthode doit être utilisée seulement dans les cas comme le vôtre, où, quand la chaîne a été codé à l'aide d'une sorte d'héritage de l'approche sur le client ou le serveur.Voir ce post de blog:
http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx
OriginalL'auteur Jacob VanScoy
Je ne suis pas un développeur C# mais on dirait que vous avez besoin de l'url de l'ENCODER en Base64 de la chaîne avant de l'envoyer comme une url.
OriginalL'auteur Ryan White
Ne pouvez-vous pas simplement supposer un espace est un+, et de le remplacer?
😉
OriginalL'auteur Jason Bunting