最新消息:

w3a Scan 插件结构的构想问题(__import__()使用)

Python admin 2099浏览 0评论

在还没开始W3A Scan以前,从未考虑过插件结构这么个东西。直到想起以后更新功能的各种问题,

我发现应该要考虑插件结构,晚上回家的时候问了下好基友。他说没接触过,但大体明白。。。瞬间就结了。说半天还是没你弄懂。。。

最后还是昨晚自己去搜了下有关的资料,其实国内确实有人已经实现了,而且这种方法很成熟。

Python非常适合动态扩展,而这种插件更新的方法给了大伙一个很好的解决方案。对于一个庞大未知的平台或工具。

动态扩展非常适合它的需求,可能你不需要去修改主程序,只需要不断填充插件就可以满足你现有的技术需求。

好比做安全,插件开发比平台开发更加有价值。主要体现在技术革新,例如现在出了某个Oday,而这个Oday的检测方式

不太符合你目前的平台设计需求,同时你的接口也无法利用成功。而领导却非常想你做到这个功能,怎么办?

这个时候插件出现了。。。你可以利用它来做一些你想做的功能,只要接口没问题,不影响主程序结构。

既能高效开发,又能解决需求。何乐而不为?

对此做了个Demo根据实际应用场景。需要自己深度琢磨。(不管你懂不懂,反正我是懂了)

整体结构:

root@smart:~/tmp_poject/python_poject# tree
.
├── main.py
└── plugin
    ├── DirectioryScan.py
    ├── __init__.py
    └── SQLinjectScan.py

主程序代码main.py:

root@smart:~/tmp_poject/python_poject# cat main.py 
#-*- encoding: utf-8 -*-
import os
import sys

class Scan_Main:
    def __init__(self):
        self.plugins=[]
        self.__loadPlugins()

    def __loadPlugins(self):
        ScanFilepath=os.path.split(os.path.realpath(__file__))[0]
        if os.path.exists(ScanFilepath+"/plugin"):
            for filename in os.listdir(ScanFilepath+'/plugin'):
                if not filename.endswith('.py') or filename.startswith('_'):
                    continue
                self.__runPlugins(filename)
        else:
            print "[*] Plugins directory not in here!"
            print "[*] Done."

    def __runPlugins(self,filename):
        plugins_name=os.path.splitext(filename)[0]
        plugin=__import__("plugin."+plugins_name,fromlist=[plugins_name])
        clazz=plugin.getPluginClass()
        o=clazz()
        o.setScan_Main(self)
        o.start()
        self.plugins.append(o)
        # plugin.do(self)

    def shutdown(self):
        for o in self.plugins:
            print o
            o.stop()
            o.setScan_Main(None)
        self.plugins=[]

    def print_load(self,item):
        print "[*] load plugins: %s" % item

if __name__=="__main__":
    scan_main=Scan_Main()
    scan_main.shutdown()

测试模块一:

root@smart:~/tmp_poject/python_poject# cat plugin/DirectioryScan.py 
#-*- encoding: utf-8 -*-

class Plugin1:
    def setScan_Main(self, scan_main):
        self.scan_main=scan_main

    def start(self):
        self.scan_main.print_load("plugin1")

    def stop(self):
        self.scan_main.sayGoodbye("plugin1")

def getPluginClass():
    return Plugin1

后续会把这些模块进行改进到w3a_Scan_console里面。。

欢迎关注并fork我的项目,更加欢迎小星星:https://github.com/smarttang/w3a_scan_console/

转自:http://www.cnblogs.com/xiaoCon/p/3510580.html

 

__import__() 的完全调用形式是 __import__(name, globals, locals, fromlist),name 即模块名、其后是全局和局部变量,最后是在模块中要导入的列表。比如:__import__(‘string’, globals(), locals(), [‘join’, ‘split’])。fromlist实际上就是from xxx import yyy这样语句里的yyy。但是在__import__函数里如果第一个参数是一个module,fromlist指定的是这个module里的object的话,那fromlist就实际上是没用的,因为python在import一个module的时候,实际上是编译然后执行这个module,不可能只挑出module的一部分执行,所以在第一个参数是module的时候,不管有没有fromlist,__import__都一定是要返回给你一个整个的module的。而如果第一个参数是一个package,fromlist里是指定的module,那么python就可以不读取package里其他的module,只读你fromlist里指定的module了。你的问题里是要import sys,sys是一个module,所以指不指定fromlist都是没区别的。

 

转载请注明:jinglingshu的博客 » w3a Scan 插件结构的构想问题(__import__()使用)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址