作家
登录

Node.js中遇到含空格URL的神奇“Bug”——小范围深入HTTP协议

作者: 来源: 2017-12-15 09:08:24 阅读 我要评论

  • const http = require('http'); 
  •  
  • const server = http.createServer(function(req, resp) { 
  •     console.log('🌚'); 
  •     resp.end('hello world'); 
  • }).on('clientError'function(err, sock) { 
  •     console.log('🐷'); 
  •     sock.end('HTTP/1.1 400 Bad Request\r\n\r\n'); 
  • }); 
  •  
  • server.listen(5555); 
  • 留意:因为运行到 clientError 事宜时,并没有任何 Request 和 Response 的封装,你能拿到的是一个 Node.js 华夏始的 Socket 对象,所以当你要返回数据的时刻须要本身按照 HTTP 返回数据包的格局来输出。

    这个时刻再挥起你的小手试一下 CURL 吧:

    1. $ curl 'http://127.0.0.1:5555/d d' -v 
    2. *   Trying 127.0.0.1... 
    3. * TCP_NODELAY set 
    4. * Connected to 127.0.0.1 (127.0.0.1) port 5555 (#0) 
    5. > GET /d d HTTP/1.1 
    6. > Host: 127.0.0.1:5555 
    7. User-Agent: curl/7.54.0 
    8. > Accept: */* 
    9. < HTTP/1.1 400 Bad Request 
    10. no chunk, no closeno size. Assume close to signal end 
    11. * 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。

    1. case sw_check_uri: 
    2.   switch (ch) { 
    3.   case ' '
    4.     r->uri_end = p; 
    5.     state = sw_check_uri_http_09; 
    6.     break; 
    7.  
    8.   ... 
    9.   } 
    10.  
    11.   ... 

    然后在 sw_check_uri_http_09 状况时会做一些检查:

    1. case sw_check_uri_http_09: 
    2.     switch (ch) { 
    3.     case ' '

        推荐阅读

        黑客最无奈的渗透办法,人人都会的暴力破解

      黑客在渗入渗出一个网站时,受制于本身的黑客才能以及小我思维宽度,在想尽了一切办法后,却一无所得,最终就不得不走上了暴力破解这一条陆辜暴力破解的道理就是穷举法,其根本思惟是根据标题标部分前提>>>详细阅读


      本文标题:Node.js中遇到含空格URL的神奇“Bug”——小范围深入HTTP协议

      地址:http://www.17bianji.com/lsqh/39781.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)