web-dev-qa-db-fra.com

Comment savoir si la chaîne a déjà été encodée en URL?

Comment puis-je vérifier si la chaîne a déjà été encodée? 

Par exemple, si j'encode TEST==, j'obtiens TEST%3D%3D. Si j'encode de nouveau la dernière chaîne, j'obtiens TEST%253D%253D, il faudrait que je sache avant de le faire si elle est déjà encodée ...

J'ai enregistré les paramètres encodés et je dois les rechercher. Je ne sais pas pour les paramètres d'entrée, quels seront-ils - encodés ou non, je dois donc savoir si je dois les encoder ou les décoder avant la recherche.

41
Trick

Décoder, comparer à l'original. S'il diffère, l'original est codé. Si cela ne diffère pas, l'original n'est pas encodé. Mais cela ne dit toujours pas si la version nouvellement décodée n'est pas encore encodée. Une bonne tâche pour la récursion.

J'espère que l'on ne peut pas écrire une quine en urlencode, sinon cet algorithme resterait bloqué.

36
SF.

Utilisez regex pour vérifier si votre chaîne contient des caractères non autorisés (c'est-à-dire des caractères qui ne peuvent pas être trouvés dans une chaîne codée par une URL, comme des espaces).

14
Roman

Joel on software avait une solution pour cela parfois - http://www.joelonsoftware.com/articles/Wrong.html
Ou vous pouvez ajouter un préfixe aux chaînes.

4
Padmarag

Vous ne pouvez pas en être sûr, à moins que vos chaînes ne soient conformes à un certain modèle, ou que vous gardiez une trace de vos chaînes. Comme vous l'avez constaté vous-même, une chaîne encodée peut également être encodée. Vous ne pouvez donc pas être sûr à 100% en regardant la chaîne elle-même.

3
flybywire

Essayez de décoder l'URL. Si la chaîne résultante est plus courte que la chaîne d'origine, l'URL d'origine était déjà codée. Sinon, vous pouvez l'encoder en toute sécurité (qu'elle ne soit pas codée ou même que la chaîne soit post-encodée et qu'elle reste inchangée). ). Voici un exemple de code pseudo (inspiré de Ruby):

# Returns encoded URL for any given URL after determining whether it is already encoded or not
    def escape(url)
      unescaped_url = URI.unescape(url)
      if (unescaped_url.length < url.length)
        return url
      else
        return URI.escape(url)
      end
    end
3
amit_saxena

Vérifiez votre URL pour les caractères suspects [1]. Liste des candidats:

WHITE_SPACE ,", < , > , { , } , | , \ , ^ , ~ , [ , ] , . et ` 

J'utilise:

private static boolean isAlreadyEncoded(String passedUrl) {
        boolean isEncoded = true;
        if (passedUrl.matches(".*[\\ \"\\<\\>\\{\\}|\\\\^~\\[\\]].*")) {
                isEncoded = false;
        }
        return isEncoded;
}

Pour le codage actuel, je procède avec:

https://stackoverflow.com/a/49796882/1485527

Remarque: même si votre URL ne contient pas de caractères dangereux, vous pouvez appliquer, par exemple. Punnycode encodant au nom d'hôte. Il reste donc beaucoup de place pour des vérifications supplémentaires.


[1] Vous trouverez une liste des candidats dans la section "non sécurisé" de la spécification d'URL à la page 2 . D'après ce que j'ai compris, "%" ou "#" devrait être omis lors de la vérification de l'encodage, étant donné que ces caractères peuvent également figurer dans des URL codées.

0
jschnasse

Si vous voulez être sûr que cette chaîne est encodée correctement (si elle doit l'être), il suffit de la décoder et de l'encoder à nouveau.

métacode:

100%_correctly_encoded_string = encode(decode(input_string))

la chaîne déjà encodée restera intacte. La chaîne non codée sera codée. Les chaînes contenant uniquement des caractères autorisés par l'URL resteront inchangées.

0
esergion