大多数编程语言内置的 HTTP 请求函数都会自动 UNICODE 编码。该怎么办

2018-12-07 12:09:36 +08:00
 claysec

现在就遇到一个问题,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 的解码
2968 次点击
所在节点    程序员
25 条回复
hqs0417
2018-12-07 12:13:31 +08:00
这个不是 unicode,被特殊字符被 URLENCODE 了,使用 URLDECODE 解码就好了
dacapoday
2018-12-07 12:16:19 +08:00
这是 url 编码,不是 unicode 编码。而且也不是自动的,而是不这样做就发不出去。
msg7086
2018-12-07 12:18:40 +08:00
这是国际标准。要搞非标准请求得自己改源码。
congeec
2018-12-07 12:19:53 +08:00
urllib.parse.unquote
momocraft
2018-12-07 12:30:11 +08:00
解决方法:定义和解析 URL 时遵循 RFC
sunzongzheng
2018-12-07 12:32:15 +08:00
如果不编码,多层参数就会无法解析,例如:
url?a=http://url?b=2&c=3
你说最后这个 c=3 属于哪一级参数?
claysec
2018-12-07 12:58:08 +08:00
@hqs0417 是在发出的时候会 url 编码。这个好像无法干预吧。因为我发送前的 url 是没有 url 编码的。
@dacapoday 那浏览器是怎么请求的。我用浏览器测试是没事的。
@congeec 我知道这个包。但是我表达的意思呢是发送出去会 url 编码
@sunzongzheng 不好意思啊。暂时不是你说的这个问题。
claysec
2018-12-07 12:59:07 +08:00
@msg7086 好吧。我在找找有没有方法或者思路
claysec
2018-12-07 13:00:30 +08:00
@momocraft 好的,谢谢
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'

也没能复现你说的情况,请贴出你的最小可复现样例。
no1xsyzy
2018-12-07 13:33:51 +08:00
wireshark 抓下来也是正常的一个字节
claysec
2018-12-07 14:20:35 +08:00
@no1xsyzy 上面只是举例啦。这里是抓包 https://imgur.com/CxWCCEX
binux
2018-12-07 14:40:42 +08:00
@claysec #12 你这根本不一样好吧,{} 是要被编码的。
你自己不按标准解析,你还要怪别人按标准发送了?
claysec
2018-12-07 14:42:36 +08:00
@binux 不是我不按好伐。是接受方不按。我是在找解决办法。我在上面说的很清楚了
binux
2018-12-07 14:45:35 +08:00
@claysec "导致我无法正确接收请求与响应" 可是你说的
skylancer
2018-12-07 14:47:46 +08:00
不用乱试,一个#号就能搞死你.. 你不 url encode 你请求个类似于 https://example.com/lol#3.exe 看看会发生什么事情?
claysec
2018-12-07 14:50:40 +08:00
@binux 是我的说的。可能我理解的和你们理解的不一样。没表达清楚。让你们误会了。
@skylancer 我知道这个是国际标准。我也没有说他不对。我只是想知道大家有没有办法让他发出时候不编码而已。因为我刚好有这样的需求。
binux
2018-12-07 14:52:05 +08:00
@claysec 你直接发 TCP 连接,手写个 HTTP 协议不就好了,又不难
claysec
2018-12-07 14:52:52 +08:00
@binux 好的我试试。
jifengg
2018-12-07 14:57:15 +08:00
@claysec 楼主,你不要再问怎么不编码了。因为你的出发点就错了。接收方因为没有对 url 做“国际标准”的 urldecode,这个做法本身就会出问题,你做再多都是没用的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/515316

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX