作家
登录

从nginx日志原始二进制数据还原文件

作者: 来源: 2017-12-21 12:06:39 阅读 我要评论

【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞?


nginx的access日记自定义格局记录了post请求数据,因为一些原因须要大年夜原始数据恢复出jpg格局图片。

起首处理日记,筛选出含有图片数据的日记条目,掏出个一一条进行分析,大年夜致格局如下,为了便于查看,做一下换行处理:


个中,--SgX5AyE7dwyg0smH-Tqpt-ggGQwTU9是表单的分隔字段,\x0D\x0A是回车和换行的转义字符,分别等同于\r和\n,\xFF\xD8\xFF\xE0\x00\x10JFIF\x00 ... \xD2_\xA0\x1A\x7F\xFF\xD9部分就是图片原始数据。

应用上述单行日记文件tmp.log进行调试:

  1. >>> f = open('tmp.log''rb'
  2. >>> data = f.read() 
  3. >>> data 
  4. "- | 09/Dec/2017:08:00:19 +0000 | POST /some/api HTTP/1.1 | 200 | 461 | --SgX5AyE7dwyg0smH-Tqpt-ggGQwTU9\x0D\x0AContent-Disposition: form-data; name=\x22name\x22\x0D\x0AContent-Type: text/plain; charset=UTF-8\x0D\x0A\x0D\x0value\x0D\x0A--SgX5AyE7dwyg0smH-Tqpt-ggGQwTU9\x0D\x0AContent-Disposition: form-data; name=\x22file\x22; filename=\x221512806410245.jpg\x22\x0D\x0AContent-Type: application/octet-stream\x0D\x0AContent-Transfer-Encoding: binary\x0D\x0A\x0D\x0A\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00 ... \xBC'\xF1\x8C\xCC\x83,\xFAo\xD2_\xA0\x1A\x7F\xFF\xD9 
  5. \x0D\x0A--SgX5AyE7dwyg0smH-Tqpt-ggGQwTU9--\x0D\x0A | 42097 | - | - | - | 1.1.1.1 | d1fkkbcd02eb | 127.0.0.1:8888 | 0.034 | 0.123" 
  6. >>> print data 
  7. - | 09/Dec/2017:08:00:19 +0000 | POST /some/api HTTP/1.1 | 200 | 461 | --SgX5AyE7dwyg0smH-Tqpt-ggGQwTU9\x0D\x0AContent-Disposition: form-data; name=\x22name\x22\x0D\x0AContent-Type: text/plain; charset=UTF-8\x0D\x0A\x0D\x0value\x0D\x0A--SgX5AyE7dwyg0smH-Tqpt-ggGQwTU9\x0D\x0AContent-Disposition: form-data; name=\x22file\x22; filename=\x221512806410245.jpg\x22\x0D\x0AContent-Type: application/octet-stream\x0D\x0AContent-Transfer-Encoding: binary\x0D\x0A\x0D\x0A\xFF\xD8\xFF\xE0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00 ... \xBC'\xF1\x8C\xCC\x83,\xFAo\xD2_\xA0\x1A\x7F\xFF\xD9\x0D\x0A--SgX5AyE7dwyg0smH-Tqpt-ggGQwTU9--\x0D\x0A | 42097 | - | - | - | 1.1.1.1 | d1fkkbcd02eb | 127.0.0.1:8888 | 0.034 | 0.123 
  8. >>> f.close() 

可以看出,打印到屏幕上的转义字符,如"\x0D\x0A"在文件中的原始字符串实际上是"\\x0D\\x0A"。因为""是用于转义的,所以想要显示反斜杠本身就必须转义自身。也就是说,print的时刻,"\"被转义成"",所以我们看到的是"\x0D",实际文件中储存的是"\\0D",而我们真正须要写入文件的,是"\x0D"这个转义字符,而不是"\x0D"这个字符串。

因为文件是以二进制方法打开的,攫取到的都是原始的流,所以在匹配的时刻须要应用"\\\\"来表示"\\"。

应用re库处理日记:

原始数据前面是Content-Transfer-Encoding: binary加上两个\r\n,后面是一个\r\n跟上表单瓜分字符串--SgX5AyE7dwyg0smH-Tqpt-ggGQwTU9--

  1. >>> import re 
  2. >>> pf = re.compile('^.*Content-Transfer-Encoding: binary\\\\x0D\\\\x0A\\\\x0D\\\\x0A'

      推荐阅读

      百度ABC数据中心上线:基于单路AMD EPYC

    【限时免费】岁尾最强一次云计算大年夜会,看传统、社区、互联网企业若何碰撞?AMD、百度12月14日结合宣布,基于AMD EPYC办事器平台的百度人工智能、大年夜数据、云计算(ABC)数据中间办事已经正式上线。>>>详细阅读


    本文标题:从nginx日志原始二进制数据还原文件

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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