留意:因为运行到 clientError 事宜时,并没有任何 Request 和 Response 的封装,你能拿到的是一个 Node.js 华夏始的 Socket 对象,所以当你要返回数据的时刻须要本身按照 HTTP 返回数据包的格局来输出。
这个时刻再挥起你的小手试一下 CURL 吧:
- $ curl 'http://127.0.0.1:5555/d d' -v
- * Trying 127.0.0.1...
- * TCP_NODELAY set
- * Connected to 127.0.0.1 (127.0.0.1) port 5555 (#0)
- > GET /d d HTTP/1.1
- > Host: 127.0.0.1:5555
- > User-Agent: curl/7.54.0
- > Accept: */*
- >
- < HTTP/1.1 400 Bad Request
- * no chunk, no close, no size. Assume close to signal end
- <
- * Closing connection 0
如愿以偿地输出了 400 状况码。
引申
回到 _http_server.js
接下来我们要引申评论辩论的一个点是,为什么这货不是一个真正意义上的 Bug。
起首我们看看 Nginx 这么实现这个黑科技的吧。
Nginx 实现
打开 Nginx 源码的响应地位。
我们能看到它的状况机对于 URI 和 HTTP 协定声明中心多了一个中心状况,叫 sw_check_uri_http_09,专门处理 URI 后面的空格。
在各类 URI 解析状况中,根本上都能找到这么一句话,表示若当缁ご态正则解析 URI 的各类状况并且碰到空格的话,则将状况改为 sw_check_uri_http_09。
- case sw_check_uri:
- switch (ch) {
- case ' ':
- r->uri_end = p;
- state = sw_check_uri_http_09;
- break;
- ...
- }
- ...
然后在 sw_check_uri_http_09 状况时会做一些检查:
- case sw_check_uri_http_09:
- switch (ch) {
- case ' '
推荐阅读
黑客在渗入渗出一个网站时,受制于本身的黑客才能以及小我思维宽度,在想尽了一切办法后,却一无所得,最终就不得不走上了暴力破解这一条陆辜暴力破解的道理就是穷举法,其根本思惟是根据标题标部分前提>>>详细阅读
本文标题:Node.js中遇到含空格URL的神奇“Bug”——小范围深入HTTP协议
地址:http://www.17bianji.com/lsqh/39781.html
1/2 1

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