现在就遇到一个问题,get 请求的时候。函数会在内部自动 unicode 编码将危险字符串变成%20 等然后发出 HTTP 请求包。虽然是正常功能。但是我是因为这个编码导致问题存在。
eg:
http://127.0.0.1/*123*&.txt
会变成这样
http://127.0.0.1/%2a123%2a%26.txt
导致我无法正确接收请求与响应。目前测试了 python 的 requests 包和 C#的都会自动编码发出。
小弟在此问问各位大神有没有什么解决方法或者思路。先谢谢各位了。
PS:
接收方无法控制进行 UNICODED 的解码
1
hqs0417 2018-12-07 12:13:31 +08:00
这个不是 unicode,被特殊字符被 URLENCODE 了,使用 URLDECODE 解码就好了
|
2
dacapoday 2018-12-07 12:16:19 +08:00 via iPhone 1
这是 url 编码,不是 unicode 编码。而且也不是自动的,而是不这样做就发不出去。
|
3
msg7086 2018-12-07 12:18:40 +08:00
这是国际标准。要搞非标准请求得自己改源码。
|
4
congeec 2018-12-07 12:19:53 +08:00 via iPhone
urllib.parse.unquote
|
5
momocraft 2018-12-07 12:30:11 +08:00
解决方法:定义和解析 URL 时遵循 RFC
|
6
sunzongzheng 2018-12-07 12:32:15 +08:00 via Android
如果不编码,多层参数就会无法解析,例如:
url?a=http://url?b=2&c=3 你说最后这个 c=3 属于哪一级参数? |
7
claysec OP @hqs0417 是在发出的时候会 url 编码。这个好像无法干预吧。因为我发送前的 url 是没有 url 编码的。
@dacapoday 那浏览器是怎么请求的。我用浏览器测试是没事的。 @congeec 我知道这个包。但是我表达的意思呢是发送出去会 url 编码 @sunzongzheng 不好意思啊。暂时不是你说的这个问题。 |
10
no1xsyzy 2018-12-07 13:29:15 +08:00
@claysec #7
特殊字符 URL encode 是为了解决 #6 的情况而设计的。 但开了个控制台试了一下 encodeURI("http://127.0.0.1/*123*&.txt") "http://127.0.0.1/*123*&.txt" 发现这两个符号并不会 然后是 Python: >>> m=requests.get("http://example.com/*123*&.txt") >>> m.url 'http://example.com/*123*&.txt' 也没能复现你说的情况,请贴出你的最小可复现样例。 |
11
no1xsyzy 2018-12-07 13:33:51 +08:00
wireshark 抓下来也是正常的一个字节
|
12
claysec OP @no1xsyzy 上面只是举例啦。这里是抓包 https://imgur.com/CxWCCEX
|
16
skylancer 2018-12-07 14:47:46 +08:00
不用乱试,一个#号就能搞死你.. 你不 url encode 你请求个类似于 https://example.com/lol#3.exe 看看会发生什么事情?
|
17
claysec OP |
20
jifengg 2018-12-07 14:57:15 +08:00
@claysec 楼主,你不要再问怎么不编码了。因为你的出发点就错了。接收方因为没有对 url 做“国际标准”的 urldecode,这个做法本身就会出问题,你做再多都是没用的。
|
22
passerbytiny 2018-12-07 15:27:11 +08:00
@claysec #7 关于 URL 的部分,不管你是按地址访问还是 Ajax 请求,浏览器总是自动编码,正常的服务器总是自动解码。编程方式下的基于 HTTP 的请求,也必须遵循类似规则,发送方必须编码,接收方必须解码。除非你用的不是基于 HTTP 连接,否则必须遵循这样的规则。
通常在 URL 的参数部分中包含嵌套的 URL 地址时才会需要手动编解码,甚至需要使用字符替换,其他情况编解码都是自动的。你并没有详细说明你的需求,不知道你这个到底是什么问题。 |
23
no1xsyzy 2018-12-07 15:38:02 +08:00 1
@claysec #7 很奇怪,我用浏览器试了下也是 encoded ……感觉坑很大
解决了就好,其实我还找到了这个: https://stackoverflow.com/a/40655848/6202760 |
25
ryd994 2018-12-08 10:22:58 +08:00 via Android
手写 socket 配合 httplib 处理不就好了
|