Подтвердить что ты не робот

Как узнать, была ли строка уже закодирована в URL?

Как я могу проверить, была ли строка уже закодирована?

Например, если я кодирую TEST==, я получаю TEST%3D%3D. Если я снова закодирую последнюю строку, я получаю TEST%253D%253D, я должен был бы знать, прежде чем делать это, если он уже закодирован...

У меня закодированные параметры сохранены, и мне нужно их искать. Я не знаю, для входных параметров, что они будут - закодированы или нет, поэтому я должен знать, должен ли я кодировать или декодировать их перед поиском.

4b9b3361

Ответ 1

Декодировать, сравнить с оригиналом. Если он отличается, оригинал закодирован. Если он не отличается, оригинал не закодирован. Но все же он ничего не говорит о том, что новая декодированная версия еще не закодирована. Хорошая задача для рекурсии.

Я надеюсь, что нельзя писать quine в urlencode, или этот алгоритм застрял.

Ответ 2

Используйте regexp, чтобы проверить, содержит ли ваша строка недопустимые символы (т.е. символы, которые не могут быть найдены в строке с кодировкой URL, например, в пробеле).

Ответ 3

У Joel на программное обеспечение было решение для этого когда-нибудь назад - http://www.joelonsoftware.com/articles/Wrong.html
Или вы можете добавить префикс к строкам.

Ответ 4

Попробуйте расшифровать URL. Если результирующая строка короче оригинала, исходный URL-адрес уже был закодирован, иначе вы можете безопасно закодировать его (либо он не закодирован, либо даже после кодирования url остается как есть, поэтому повторное кодирование не приведет к неправильному URL-адресу). Ниже приведен пример псевдо-кода (вдохновленный рубином):

# 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

Ответ 5

Вы не можете точно знать, если ваши строки не соответствуют определенному шаблону или вы не отслеживаете свои строки. Как вы отметили сами, закодированная строка также может быть закодирована, поэтому вы не можете быть на 100% уверенным, посмотрев на собственно строку.

Ответ 6

Проверьте ваш URL на наличие подозрительных символов [1]. Список кандидатов:

WHITE_SPACE ,", <, >, {, }, | , \, ^, ~, [, ],. И '

Я использую:

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

Для фактического кодирования я продолжаю:

fooobar.com/questions/14909/...

Примечание. Даже если ваш URL-адрес не содержит небезопасных символов, вы можете захотеть их применить, например, кодировку Punnycode к имени хоста. Так что еще есть много места для дополнительных проверок.


[1] Список кандидатов можно найти в разделе "небезопасные" спецификации URL-адреса на странице 2. В моем понимании "%" или "#" следует не указывать при проверке кодировки, поскольку эти символы могут встречаться в кодированном виде. URL также.

Ответ 7

Если вы хотите быть уверены, что строка закодирована правильно (если она должна быть закодирована) - просто декодируйте и кодируйте ее еще раз.

Metacode:

100%_correctly_encoded_string = encode(decode(input_string))

уже закодированная строка останется нетронутой. Некодированная строка будет закодирована. Строка, содержащая только символы, разрешенные в URL, также останется нетронутой.

Ответ 8

Согласно спецификации (https://tools.ietf.org/html/rfc3986) все URL-адреса ДОЛЖНЫ начинаться со схемы, за которой следует:

Поскольку в качестве разделителя между схемой и остальной частью URI требуется двоеточие, любая строка, содержащая двоеточие, не кодируется.

(Это предполагает, что вам не дадут неполный URI без какой-либо схемы.)

Таким образом, вы можете проверить, содержит ли строка двоеточие, если нет, url-кодировать ее, и если эта строка содержит двоеточие, исходная строка была закодирована URL-адресом, если нет, проверить, отличаются ли строки, и если да, еще раз urldecode, а если нет, это не правильный URI.

Вы можете упростить этот цикл, если знаете, какие схемы вы можете ожидать.

Ответ 9

Благодаря этому ответу я кодировал функцию (язык JS), которая кодирует URL только один раз, с помощью encodeURI, чтобы вы могли вызвать его, чтобы убедиться, что кодируется только один раз, и вам не нужно знать, если URL уже закодирован.

ES6:

var getUrlEncoded = sURL => {
    if (decodeURI(sURL) === sURL) return encodeURI(sURL)
    return getUrlEncoded(decodeURI(sURL))
}

Pre ES6:

var getUrlEncoded = function(sURL) {
    if (decodeURI(sURL) === sURL) return encodeURI(sURL)
    return getUrlEncoded(decodeURI(sURL))
}

Вот несколько тестов, поэтому вы можете видеть, что URL-адрес только закодирован один раз:

getUrlEncoded("https://example.com/media/Screenshot27 UI Home.jpg")
//"https://example.com/media/Screenshot27%20UI%20Home.jpg"
getUrlEncoded(encodeURI("https://example.com/media/Screenshot27 UI Home.jpg"))
//"https://example.com/media/Screenshot27%20UI%20Home.jpg"
getUrlEncoded(encodeURI(encodeURI("https://example.com/media/Screenshot27 UI Home.jpg")))
//"https://example.com/media/Screenshot27%20UI%20Home.jpg"
getUrlEncoded(decodeURI("https://example.com/media/Screenshot27 UI Home.jpg"))
//"https://example.com/media/Screenshot27%20UI%20Home.jpg"
getUrlEncoded(decodeURI(decodeURI("https://example.com/media/Screenshot27 UI Home.jpg")))
//"https://example.com/media/Screenshot27%20UI%20Home.jpg"