扫描器之自动生成网页报告

一、实验介绍

1.1 实验内容

前面我们写了很多功能模块,信息都是输出到控制台上的,有时候信息多了的时候根本看不过来,我们这节课做的就是将结果存储下来写到文件,然后写个网页生成器来自动生成网页报告。 最后结果是这样哒,是不是感觉酷酷的? 此处输入图片的描述

1.2 实验知识点

  • 数据收集与输出

1.3 实验环境

  • Python2.7
  • Xfce终端
  • Sublime

1.4 适合人群

本课程难度为一般,属于初级级别课程,适合具有Python基础的用户,熟悉python基础知识加深巩固。

1.5 代码获取

$ wget http://labfile.oss.aliyuncs.com/courses/761/shiyanlouscan9.zip
$ unzip shiyanlouscan9.zip

二、实验内容

2.1 定义结果输出类

我们需要创建一个结果输出类,用这个类来收集数据,输出数据,并且可以写到hmtl中生成网页报告。

定义一个ouputer

类中我们定义几个函数即可:

class outputer
    def add(self,key,data): # 通过字典方式添加数据
    def add_list(self,key,data): # 通过列表方式添加数据
    def get(self,key):# 获取某个数据
    def show(self):# 显示加入的数据
    def build_html(self,name):# 生成网页 name为保存的文件名

2.2 完整代码

类中实列一个变量,因为类定义的时候实例化的变量是不会改变的。 完整代码:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

class outputer:
    data = {}

    def get(self,key):
        if key in self.data:
            return self.data[key]
        return None

    def add(self,key,data):
        self.data[key] = data

    def add_list(self,key,data):
        if key not in self.data:
            self.data[key] = []
        self.data[key].append(data)

    def show(self):
        for key in self.data:
            print "%s:%s"%(key,self.data[key])

    def _build_table(self):
        _str = ""
        for key in self.data:
            if isinstance(self.data[key],list):
                _td = ""
                for key2 in self.data[key]:
                    _td += key2 + '</br>'
                _str += "<tr><td>%s</td><td>%s</td></tr>"%(key,_td)
            else:
                _str += "<tr><td>%s</td><td>%s</td></tr>"%(key,self.data[key])
        return _str
    def build_html(self,filename):
        html_head = '''
        <!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="gbk">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>W8ayscan Report</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
      <script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>
  <body>
<div class="container container-fluid">
    <div class="row-fluid">
        <div class="span12">
            <h3 class="text-center">
                W8ayscan Report
            </h3>
            </BR>
            <table class="table table-bordered">
                <thead>
                    <tr>
                        <th>
                            title
                        </th>
                        <th>
                            content
                        </th>
                    </tr>
                </thead>
                <tbody>
                    build_html_w8ayScan
                </tbody>
            </table>
        </div>
    </div>
</div>  </body>
</html>'''.replace("build_html_w8ayScan",self._build_table())
        file_object = open(filename+'.html', 'w')
        file_object.write(html_head)
        file_object.close()

保存在/lib/core/outputer.py

2.3 使用方法

在需要的地方

from lib.core import outputer
output = outputer.outputer()

来初始化,通过output.add()或者output.add_list()加入数据, 在功能模块中显示数据的地方将数据添加进来即可。

比如这是w8ay.py中的。

此处输入图片的描述

但是数据打印出来的地方都是在每个功能模块的内部实现的,所以我们要在每个功能模块中类似加入。是的,每个。。。

web敏感文件扫描模块加入

此处输入图片的描述

端口扫描中加入

此处输入图片的描述

等等。。 只要是功能模块输出的地方全部加上这个类,爬虫插件里面也要加上。

最后,在主调度程序每调用完一个程序后生成一次html。 此处输入图片的描述

扫描器运行截图

此处输入图片的描述

生成的网页报告

此处输入图片的描述

三、总结

至此,扫描器课程已经完结了,还记得第一节课的扫描器脑图吗 此处输入图片的描述已经完成了其中大部分的功能,有部分功能在后期编写过程中感觉不需要了,所以没有加上,其实,如果学完了这个系列课程的话,相信大家已经有一个基本的制作扫描器的概念了。