it-swarm.dev

Como descobrir se a string já foi codificada por URL?

Como eu poderia verificar se a string já foi codificada?

Por exemplo, se eu codificar TEST==, obtenho TEST%3D%3D. Se eu codificar novamente a última string, eu obtenho TEST%253D%253D, eu teria que saber antes de fazer isso se já estivesse codificado ...

Eu codifiquei os parâmetros salvos e preciso procurá-los. Eu não sei para parâmetros de entrada, o que eles serão codificados ou não, então eu tenho que saber se eu tenho que codificá-los ou decodificá-los antes da pesquisa.

41
Trick

Decodifique, compare com o original. Se diferir, o original é codificado. Se não for diferente, o original não é codificado. Mas ainda não diz nada sobre se a nova versão decodificada ainda não está codificada. Uma boa tarefa para recursão.

Espero que não seja possível escrever um quine em urlencode, ou esse algoritmo ficará preso.

36
SF.

Use regex para verificar se sua string contém caracteres ilegais (ou seja, caracteres que não podem ser encontrados em uma string codificada por URL, como espaço em branco).

14
Roman

Joel no software tinha uma solução para isso algum dia atrás - http://www.joelonsoftware.com/articles/Wrong.html
Ou Você pode adicionar algum prefixo às Strings.

4
Padmarag

Você não pode ter certeza, a menos que suas strings estejam de acordo com um determinado padrão, ou você monitore suas strings. Como você observou por si mesmo, uma String que é codificada também pode ser codificada, portanto, você não pode ter 100% de certeza observando a string em si.

3
flybywire

Tente decodificar o URL. Se a string resultante for menor que a original, a URL original já foi codificada, senão você pode codificá-la com segurança (ela não está codificada ou até mesmo codifica a URL como está), portanto, codificar novamente não resultará em um URL incorreto ). Abaixo está um exemplo de código pseudo (inspirado no 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

Verifique seu URL para caracteres suspeitos [1]. Lista de candidatos:

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

Eu uso:

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

Para a codificação atual eu prossigo:

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

Nota : mesmo que o seu URL não contenha caracteres inseguros que você queira aplicar, por exemplo Punnycode codificação para o nome do host. Portanto, ainda há muito espaço para verificações adicionais.


[1] Uma lista de candidatos pode ser encontrada na seção "inseguro" do URL spec at Page 2. No meu entendimento, '%' ou '#' devem ser omitidos na codificação. verifique, pois esses caracteres podem ocorrer em URLs codificadas também.

0
jschnasse

Se você quiser ter certeza de que a string está codificada corretamente (se precisar ser codificada) - decodifique-a e codifique-a novamente.

metacódigo:

100%_correctly_encoded_string = encode(decode(input_string))

a string já codificada permanecerá intocada. A string não codificada será codificada. Cadeia de caracteres com apenas caracteres permitidos por url também permanecerá intocada.

0
esergion