w 3 a Scanプラグイン構造の構想問題

4887 ワード

W 3 A Scanを始める前に、プラグイン構造というものを考えたことがありません.後で機能を更新する様々な問題を思い出すまで、
プラグインの構造を考えるべきだと気づき、夜家に帰るときに親友に聞いた.彼は接触したことがないと言ったが、大体分かった...あっという間に結ばれた.しばらく言っても君にはわからなかった...
最后にやはり昨夜自分で関连する资料を探して、実は国内は确かにすでに実现した人がいて、しかもこの方法はとても成熟しています.
Pythonはダイナミック拡張に適しており、このプラグインの更新方法は皆さんに良い解決策を与えています.膨大な未知のプラットフォームまたはツールについて.
動的拡張は、プライマリ・プログラムを変更する必要がなく、プラグインを絶えず埋め込むだけで既存のテクノロジーのニーズを満たすことができます.
セキュリティのように、プラグイン開発はプラットフォーム開発よりも価値があります.主に技術革新に現れて、例えば今あるOdayが出て、このOdayの検出方式
現在のプラットフォーム設計のニーズに合わないと同時に、インタフェースも成功しません.リーダーはあなたがこの機能をしたいと思っています.どうすればいいですか.
この時プラグインが現れました..インタフェースに問題がなく、プライマリ・プログラム構造に影響を与えない限り、やりたい機能を作ることができます.
効率的に開発でき、ニーズを解決できます.どうして喜んでやらないのですか.
これに対してDemoは実際にシーンを適用した.自分で深く考えなければならない.(分かっても分からなくても、どうせわかったんだから)
全体構造:
1 root@smart:~/tmp_poject/python_poject# tree
2 .
3 ├── main.py
4 └── plugin
5     ├── DirectioryScan.py
6     ├── __init__.py
7     └── 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()

テストモジュール1:
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

その後、これらのモジュールをw 3 a_に改善します.Scan_consoleの中..
私のプロジェクトに注目してforkして、もっと小さな星を歓迎します.https://github.com/smarttang/w3a_scan_console/