开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散
HTTP 的 Request 数据包其实是文本格局的,在 Raw 的状况下,大年夜概是以如许的情势存在:

起首声明,我在“Bug”字眼上加了引号,天然是为了解释它并非一个真 Bug。
所以实际上大年夜家日常平凡在文┞仿中、浏览器调试对象中看到的什么请求头啊什么的,都是以文本情势存在的,以换行符瓜分。
问题抛出
昨天有个童鞋在看后台监控的时刻,忽然发清楚明了一个缺点:
大年夜概意思就是说:一台办事器经由过程 HTTP 协定去请求另一台办事器的时刻,单方面被对方办事器断开了连接——并且并没有任何返回。
开端重现
客户端 CURL 指令
其拭魅此次请求的一些猫腻很轻易就能发明——在 URL 中有空格。所以我们能简化出一条最简单的 CURL 指令:
- $ curl "http://foo/bar baz" -v
留意:不带任何转义。
最小 Node.js 源码
好的,那么接下去开端写响应的最简单的 Node.js HTTP 办事端源码。
- 'use strict';
- const http = require('http');
- const server = http.createServer(function(req, resp) {
- console.log('🌚');
- resp.end('hello world');
- });
- server.listen(5555);
大年夜功告成,启动这段 Node.js 代码,开端尝尝看膳绫擎的指令吧。
如不雅你也正在跟着测验测验这件工作的话,你就会发明 Node.js 的敕令行没有输出任何信息,尤其是嘲讽的 '🌚',而在 CURL 的结不雅中,你将会看见:
- case s_req_http_start:
- switch (ch) {
- case 'H':
- UPDATE_STATE(s_req_http_H);
- break;
- case ' ':
- break;
- default:
- SET_ERRNO(HPE_INVALID_CONSTANT);
- goto error;
- }
- break;
- case s_req_http_H:
- STRICT_CHECK(ch != 'T');
- UPDATE_STATE(s_req_http_HT);
- break;
- case s_req_http_HT:
- ...
- case s_req_http_HTT:
- ...
- case s_req_http_HTTP:
- ...
- case s_req_first_http_major:
- ...
推荐阅读
黑客在渗入渗出一个网站时,受制于本身的黑客才能以及小我思维宽度,在想尽了一切办法后,却一无所得,最终就不得不走上了暴力破解这一条陆辜暴力破解的道理就是穷举法,其根本思惟是根据标题标部分前提>>>详细阅读
本文标题:Node.js中遇到含空格URL的神奇“Bug”——小范围深入HTTP协议
地址:http://www.17bianji.com/lsqh/39781.html
1/2 1

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