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