110 votes

Est-ce qu'un slash ("/") est équivalent à un slash encodé ("%2F") dans la partie du chemin d'une URL HTTP

Je possède un site qui traite différemment / et %2F dans la partie chemin (et non dans la chaîne de requête) d'une URL. Est-ce une mauvaise pratique selon le RFC ou le monde réel ?

Je me pose cette question car je suis continuellement confronté à des petites surprises avec le framework web que j'utilise (Ruby on Rails) ainsi qu'avec les couches en dessous (Passenger, Apache, par exemple, j'ai dû autoriser ALLOW_ENCODED_SLASHES pour Apache). Je commence à penser à supprimer complètement les slashes encodés, mais je me demande si je devrais signaler des bugs là où je remarque un comportement étrange impliquant des slashes encodés.

Pourquoi ai-je des slashes encodés en premier lieu, voici les routes que j'ai :

:controller/:foo/:bar

:foo est quelque chose comme un chemin pouvant contenir des slashes. J'ai pensé que la chose la plus simple à faire serait d'URL-encoder foo pour que les slashes soient ignorés par le mécanisme de routage. Maintenant, j'ai des doutes, et il est clair que les frameworks ne supportent pas vraiment cela, mais selon le RFC, est-ce faux de faire cela de cette façon ?

Voici quelques informations que j'ai rassemblées :

RFC 1738 (URLs) :

En général, une URL a la même interprétation qu'un octet représenté par un caractère et qu'un octet encodé. Cependant, cela n'est pas vrai pour les caractères réservés : encoder un caractère réservé pour un schéma particulier peut changer la sémantique d'une URL.

RFC 2396 (URIs) :

Ces caractères sont appelés "réservés", car leur utilisation dans le composant de l'URI est limitée à leur objectif réservé. Si les données pour un composant de l'URI entraient en conflit avec l'objectif réservé, les données en conflit doivent être échappées avant la formation de l'URI.

(est-ce que s'échapper ici signifie autre chose qu'encoder le caractère réservé ?)

RFC 2616 (HTTP/1.1) :

Les caractères autres que ceux des ensembles "réservé" et "non sûr" (voir RFC 2396 [42]) sont équivalents à leur encodage "% HEX HEX".

Il y a aussi ce rapport de bug pour Rails, où ils semblent attendre un comportement différent pour le slash encodé :

Exactement, je m'attends à des résultats différents car ils pointent vers des ressources différentes.

Il cherche le fichier littéral foo/bar dans le répertoire racine. La version non échappée cherche le fichier bar dans le répertoire foo.

Il est clair d'après les RFC que brut vs. encodé est équivalent pour les caractères non réservés, mais quelle est la situation pour les caractères réservés ?

-1voto

kpgan8204 Points 41

Essayer ci-dessous obj=ici votre objet...

Gson gson = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create();
       return Base64.getUrlEncoder().withoutPadding().encodeToString(gson.toJson(obj).getBytes());

-4voto

user711672 Points 153

encodeURI()/decodeURI et encodeURIComponent()/decodeURIComponent sont des fonctions utilitaires pour gérer cela. En savoir plus ici https://stackabuse.com/javascripts-encodeuri-function/

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