java-如何找出字符串是否已被URL编码?

如何检查字符串是否已经编码?

例如,如果我对TEST==进行编码,则得到TEST%3D%3D。如果我对最后一个字符串再次进行编码,则得到TEST%253D%253D,在这样做之前,我必须知道它是否已经被编码。

我已经保存了编码参数,我需要搜索它们。 我不知道输入参数是什么,是编码还是不编码,所以我必须知道在搜索之前是否必须对它们进行编码或解码。

9个解决方案

40 votes

解码,与原始图像进行比较。 如果确实不同,则对原稿进行编码。 如果没有区别,则原始文件不会被编码。 但是对于新解码的版本是否仍未编码,它仍然没有说什么。 递归的好任务。

我希望不能用urlencode编写quine,否则此算法会卡住。

SF. answered 2020-06-24T14:45:00Z

15 votes

使用regex检查您的字符串是否包含非法字符(即,在URL编码的字符串中找不到的字符,例如空格)。

Roman answered 2020-06-24T14:45:20Z

4 votes

关于软件的Joel有时会为此提供解决方案-[http://www.joelonsoftware.com/articles/Wrong.html]

或者,您可以在字符串中添加一些前缀。

Padmarag answered 2020-06-24T14:45:44Z

3 votes

尝试解码网址。 如果结果字符串比原始字符串短,则说明原始URL已经被编码,否则您可以安全地对其进行编码(要么不进行编码,要么对URL进行后期编码,否则保持不变,因此再次编码不会导致错误的URL )。 以下是示例伪代码(受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

amit_saxena answered 2020-06-24T14:46:05Z

2 votes

您无法确定,除非您的字符串符合特定模式,否则您将跟踪字符串。 正如您自己所指出的那样,也可以对已编码的字符串进行编码,因此无法通过查看字符串本身来确保自己100%地确定。

flybywire answered 2020-06-24T14:46:25Z

0 votes

检查您的URL中是否包含可疑字符[1]。候选人名单:

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

我用:

private static boolean isAlreadyEncoded(String passedUrl) {

boolean isEncoded = true;

if (passedUrl.matches(".*[\\ \"\\\\{\\}|\\\\^~\\[\\]].*")) {

isEncoded = false;

}

return isEncoded;

}

对于实际的编码,我继续:

[HTTPS://stack overflow.com/啊/49796882/1485527]

注意:即使您的网址不包含不安全的字符,您可能仍要应用,例如 Punnycode编码为主机名。 因此,仍有大量空间可以进行其他检查。

[1]可在第2页的URL规范的“不安全”部分中找到候选列表。根据我的理解,在编码检查中应省略“%”或“#”,因为这些字符也可能出现在编码的URL中。

jschnasse answered 2020-06-24T14:47:12Z

0 votes

如果要确保正确编码了字符串(如果需要编码),则只需再次解码并编码即可。

元代码:

100%_correctly_encoded_string = encode(decode(input_string))

已经编码的字符串将保持不变。 未编码的字符串将被编码。 仅包含url允许的字符的字符串也将保持不变。

esergion answered 2020-06-24T14:47:41Z

0 votes

根据规范([https://tools.ietf.org/html/rfc3986)],所有URL都必须以以下方案开头:

由于必须使用冒号作为方案与URI其余部分之间的分隔符,因此不会对任何包含冒号的字符串进行编码。

(这假设您将获得没有方案的不完整URI。)

因此,您可以测试字符串是否包含冒号,如果没有,则对其进行urldecode,如果该字符串包含冒号,则对原始字符串进行url编码,如果不是,请检查字符串是否不同,如果不同,则再次进行urldecode,否则 ,它不是有效的URI。

如果您知道可以期望的方案,则可以使此循环更简单。

Luke Mlsna answered 2020-06-24T14:48:20Z

0 votes

感谢这个答案,我编码了一个函数(JS语言),使用2937227746927444944992仅对URL进行了一次编码,因此您可以调用该函数以确保仅对它进行一次编码,而无需知道URL是否已被编码。

ES6:

var getUrlEncoded = sURL => {

if (decodeURI(sURL) === sURL) return encodeURI(sURL)

return getUrlEncoded(decodeURI(sURL))

}

对于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"

Alberto answered 2020-06-24T14:48:54Z

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐