原因为何就交给童鞋们本身推敲吧。
那么,为什么即使在 Nginx 支撑空格 URI 的情况下,我还说 Node.js 这个不算 Bug,并且指明 Nginx 是“黑科技”呢?
后来我去看了 HTTP 协定 RFC。
原因在于 Network Working Group 的 RFC 2616,关于 HTTP 协定的规范。
大年夜源码中文我们能看到,http-parser 的流程是大年夜头到尾以 O(n) 的时光复杂度对字符串逐字扫描,并且不撤退撤退也不往前跳。
在 RFC 2616 的 3.2.1 节中做了一些解释,它说了在 HTTP 协定中关于 URI 的文法和语义参照了 RFC 2396。
URIs in HTTP can be represented in absolute form or relative to some known base URI, depending upon the context of their use. The two forms are differentiated by the fact that absolute URIs always begin with a scheme name followed by a colon. For definitive information>如 # 将用于浏览器地址栏的 Hash;而 % 则会与 URI 转义一同应用,所以不该零丁涌如今 URI 中。
于是乎,HTTP 请求中,包体的 URI 似乎本就不该该出现空格,而 Nginx 是一个黑魔法的姿势。
小结
嚯,写得累逝世了。本次的一个摸索基于了一个有空格非正常的 URI 经由过程 CURL 或者其它一些客户端请求时,Node.js 出现的 Bug 状况。
实际上发明这个 Bug 的时刻,客户端请求似乎是因为那边的开辟者手抖,不当心将不该该拼接进来的内容给拼接到了 URL 中,类似于 $ rm -rf /。
一开端我认为这是 Node.js 的 Bug,在探寻之后发明是因为我们本身没用 Node.js HTTP Server 供给的 clientError 事宜做精确的处理。而 Nginx 的┞俘常请求则是它的黑科技。这些谜底都能大年夜 RFC 中寻找——再次表现了碰到问题看源码看规范的重要性。
另,我本计算给 http-parser 也加上黑魔法,后来我快写好的时刻发明它是流式的,很多状况没法在现有的体系中保存下来,最后放弃了,反正这也不算 Bug。不过在今后有时光的时刻,感到照样可以好好整顿一下代码,好好修改一下给提个 PR 上去,以此自勉。
【编辑推荐】
- Node.js 8.5正式宣布,新特点一览
- 向Node.js核心供献代码的六个步调
- 论HTTP机能,Go与.NET Core一争雌雄
- Kafka 1.0宣布,拜别4位数版本号;Angular 5.0和Node.js 9.0迎重大年夜更新
- Node.js vs Ruby on Rails:哪个最合适Web开辟?
推荐阅读
黑客在渗入渗出一个网站时,受制于本身的黑客才能以及小我思维宽度,在想尽了一切办法后,却一无所得,最终就不得不走上了暴力破解这一条陆辜暴力破解的道理就是穷举法,其根本思惟是根据标题标部分前提>>>详细阅读
本文标题:Node.js中遇到含空格URL的神奇“Bug”——小范围深入HTTP协议
地址:http://www.17bianji.com/lsqh/39781.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示