web-dev-qa-db-fra.com

l'URL Request.Querystring décode-t-il automatiquement une chaîne?

Je travaille avec une page où j'ai une URL comme:
/répertoire/entreprise/fabricant

En utilisant des règles de réécriture, cela est réécrit

test avec/directory/company/dunkin% 26donuts /

Certains fabricants ont une esperluette à leur nom. J'ai donc pensé pouvoir remplacer l'esperluette par %26. Cependant, lorsque je débogue le code et survole Request.QueryString ça me montre {qq=company&manf=dunkin&donuts&cond=} et Request.QueryString["manf"] me donne 'dunkin'

Si j'utilise %24 ($) au lieu de l'esperluette, survolant Request.QueryString Donne moi {qs=company&manf=dunkin%24donuts&cond=} et Request.QueryString["manf"] me donne 'dunkin $ donuts'

Je ne comprends pas les différents comportements ici. Pourquoi semble-t-il que la valeur codée en URL d'une esperluette soit décodée avant que vous ne demandiez réellement une clé spécifique, mais un autre caractère codé en URL, comme un signe dollar, n'est décodé qu'après avoir réellement demandé cette clé spécifique?

Est-ce un changement récent? J'ai toujours pensé Request.QueryString[key] a renvoyé le texte réel sans le décoder au préalable. Ou cela a-t-il quelque chose à voir avec la réécriture d'URL?

23
merk

Remplacement de l'esperluette par %26 devrait provoquer l'échappement de cette valeur, donc Request.QueryString["manf"] donnerait dunkin&donuts.

Le demandeur de cette question similaire a fini par se rendre compte qu'un autre code sur la même page a fini par pré-décoder ses esperluettes. Est-il possible que quelque chose de similaire se produise? Peut-être que javascript décode le %26 dans une esperluette avant de l'envoyer à votre serveur. Essayez d'utiliser Firebug ou les outils de développement de Chrome pour voir la chaîne d'URL réelle envoyée par le navigateur.

Mise à jour

Après avoir relu la question, je me rends compte que vous utilisez probablement un URL Rewriter. Cet article décrit un problème similaire, et je ne connais pas de solution sûre, mais vous voudrez peut-être essayer de double-coder l'esperluette en utilisant %2526 au lieu de %26.

9
StriplingWarrior

ASP.NET appelle automatiquement UrlDecode() lorsque vous accédez à une propriété par index de clé (c'est-à-dire (Request.QueryString["key"]).

Si vous voulez qu'il soit encodé, faites simplement:

HttpUtility.UrlEncode(Request.QueryString["key"]);

En ce qui concerne l'esperluette en particulier, il s'agit d'un caractère spécial car il est déjà utilisé comme délimiteur de chaîne de requête. L'encodage et le décodage d'une esperluette devraient toujours vous donner & Pour cette raison.

35
mattytommo

Je pense qu'une solution pourrait être de modifier la règle UrlRewrite en quelque chose comme.

    <rule name="TagPage" stopProcessing="true">
      <match url="^(tag)/([^/]+)/?$"/>
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
      </conditions>
      <action type="Rewrite" url="ListByTags.aspx?tag={UrlEncode:{R:2}}"/>
    </rule>

La ligne importante ici est le {UrlEncode: {R: 2}}. Cela a résolu le problème pour moi!

3
Olaj