58 votes

Barre oblique encodée en URL

Ma Carte est:

routes.MapRoute(
   "Default",                                             // Route name
   "{controller}/{action}/{id}",                          // URL with params
   new { controller = "Home", action = "Index", id = "" } // Param defaults
);

Si j'utilise l'URL http://localhost:5000/Home/About/100%2f200 il n'y a pas d'itinéraire correspondant. - Je modifier l'URL d' http://localhost:5000/Home/About/100 puis la route est de nouveau mis en correspondance.

Est-il un moyen facile de travailler avec des paramètres qui contiennent des barres obliques? D'autres les valeurs d'échappement (espace %20) semblent fonctionner.

EDIT:

Pour encoder en Base64 fonctionne pour moi. Il rend l'URL laid, mais c'est OK pour l'instant.

public class UrlEncoder
{ 
    public string URLDecode(string  decode)
    {
        if (decode == null) return null;
        if (decode.StartsWith("="))
        {
            return FromBase64(decode.TrimStart('='));
        }
        else
        {
            return HttpUtility.UrlDecode( decode) ;
        }
    }

    public string UrlEncode(string encode)
    {
        if (encode == null) return null;
        string encoded = HttpUtility.PathEncode(encode);
        if (encoded.Replace("%20", "") == encode.Replace(" ", ""))
        {
            return encoded;
        }
        else
        {
            return "=" + ToBase64(encode);
        }
    }

    public string ToBase64(string encode)
    {
        Byte[] btByteArray = null;
        UTF8Encoding encoding = new UTF8Encoding();
        btByteArray = encoding.GetBytes(encode);
        string sResult = System.Convert.ToBase64String(btByteArray, 0, btByteArray.Length);
        sResult = sResult.Replace("+", "-").Replace("/", "_");
        return sResult;
    }

    public string FromBase64(string decode)
    {
        decode = decode.Replace("-", "+").Replace("_", "/");
        UTF8Encoding encoding = new UTF8Encoding();
        return encoding.GetString(Convert.FromBase64String(decode));
    }
}

EDIT1:

À la fin il s'est avéré que la meilleure façon était de sauver une jolie chaîne formatée pour chaque article que j'ai besoin de sélectionner. C'est beaucoup mieux, parce que maintenant, je ne coder les valeurs et jamais les décoder. Tous les caractères spéciaux deviennent des "-". Beaucoup de mes db-tables ont maintenant cette colonne supplémentaire "URL". Les données sont assez stables, c'est pourquoi je peux aller dans cette voie. Je peux même vérifier, si les données en "URL" est unique.

EDIT2:

Attention aussi à caractère espace. Il semble ok sur VS serveur web intégré, mais différent sur iis7 http://stackoverflow.com/questions/1651711/properly-url-encode-space-character

48voto

Mehrdad Afshari Points 204872

Si ce n'est que votre dernier paramètre, vous pouvez faire:

 routes.MapRoute(
    "Default",                                                // Route name
    "{controller}/{action}/{*id}",                            // URL with parameters
    new { controller = "Home", action = "Index", id = "" });  // Parameter defaults
 

24voto

Don Rolling Points 529

Voici une explication simple de la solution et un résumé de ce qui a déjà été dit.

Côté demande:

  1. UrlEncode votre chemin.
  2. Remplacez le '%' par '!'.
  3. Faites la demande.

Côté de la réponse:

  1. Remplace le '!' avec '%'.
  2. UrlDécode ton chemin.
  3. Utilisez les paramètres tels qu'ils étaient prévus.

Rincer, répéter, profiter.

24voto

Andrew Arnott Points 35346

Dans .NET 4.0 bêta 2, l'équipe CLR a offert une solution de contournement.

Ajouter à votre site web.fichier de configuration:

<uri> 
    <schemeSettings>
        <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
    </schemeSettings>
</uri>

Cela provoque la classe Uri à se comporter conformément à la RFC décrivant les Uri, permettant des barres obliques pour être échappé dans le chemin sans être sans échappement. L'équipe CLR rapports qu'ils s'écartent de la spec pour des raisons de sécurité, et la définition de cette dans votre .fichier de configuration fait, fondamentalement, vous prenez possession de la sécurité supplémentaire facteurs impliqués dans les pas unescaping les barres obliques.

13voto

Jon Galloway Points 28243

Une autre option consiste à utiliser une valeur de chaîne de requête. Très boiteux, mais plus simple que l'encodage personnalisé.

 http://localhost:5000/Home/About?100%2f200
 

9voto

simonox Points 218

Même pour Java / Tomcat.

Il y a toujours un problème si vous avez une codé "/" (%2F) dans votre URL.

RFC 3986 - Section 2.2 dit: "Si les données pour le composant URI serait en conflit avec un caractère réservé du but comme un séparateur, le conflit de données doit être pour cent codé avant l'URI est formée". (RFC 3986 - Section 2.2)

Mais il y a un Problème avec Tomcat:

http://tomcat.apache.org/security-6.html - Fixe dans Apache Tomcat 6.0.10

important: traversée de Répertoire CVE-2007-0450

Tomcat permet '\', '%2F' et '%5C" [...] .

La suite de propriétés système Java ont été ajoutés à Tomcat pour fournir un contrôle supplémentaire de la manipulation de chemin des séparateurs dans les Url (les deux options par défaut à false):

  • org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH: vrai|faux
  • org.apache.catalina.connecteur.CoyoteAdapter.ALLOW_BACKSLASH: vrai|faux

En raison de l'impossibilité de garantir que toutes les Url sont traitées par Tomcat ils sont dans des serveurs proxy, Tomcat doit toujours être assurée que si aucune proxy limitant le contexte de l'accès a été utilisé.

Affecte: 6.0.0-6.0.9

Donc, si vous avez une URL avec l' %2F caractère, Tomcat retourne: "400 URI non Valide: noSlash"

Vous pouvez passer de la correction de bug dans le script de démarrage de Tomcat:

set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%   -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X