輕量級插件式掃描器邏輯功能實現

從Python逐漸流行以來插件式掃描器漸漸進入人們的視野,插件式掃描器對于掃描引擎和掃描插件之間的耦合度較低,插件和引擎分離代表插件可以繼續擴充從而提高掃描器的檢測能力。

簡介

從Python逐漸流行以來插件式掃描器漸漸進入人們的視野,插件式掃描器對于掃描引擎和掃描插件之間的耦合度較低,插件和引擎分離代表插件可以繼續擴充從而提高掃描器的檢測能力。這樣的掃描器也有他的弊端,掃描速度和插件加載速度呈現正比關系。由于大多數用戶對于掃描頻率和掃描時間的關注遞增,掃描速度不再像以前那樣受到更多的關注。好比經常體檢的朋友,體檢結果發布慢一點一般不會在意。下面咱們進入正題。

架構設計

插件式掃描器在方便人們使用和擴充的同時,對于研發人員要求也有所提高。咱們要將掃描器作為類似于工廠方法還要加入控制器、任務調度、結果輸出、插件加載等一系列功能。咱們對于插件式輕量級掃描器進行架構設計。

圖片1.png

在圖中咱們對于用戶控制能力進行規劃,用戶通過控制器能夠完成提供數據、任務生成、任務調度、結果輸出。控制器中可設置全自動或半自動,方便用戶的使用。插件加載器中可以加載擴充的插件,方便研發或相關人員擴展檢測能力。

研發思路

接下來咱們對于如果去研發提供一些代碼級的思路。這樣能幫助咱們對于輕量級插件式掃描器更深入的理解。

插件加載器

插件加載器是關鍵模塊之一,通常情況下在Python之中咱們會使用到importlib模塊,如果你打算使用import() ,在功能上的確是可行,但是通過Python官方文檔得知并不值得推薦。咱們要考慮到在插件中定義一個固定方法用于執行插件,插件加載器類似于工廠方法。具體實現建議使用importlib.import_module()加載插件,插件加載之后調用run()方法,run()方法在每個獨立插件中定義,用于插件的執行和返回結果。另外需要注意獲得可用插件列表。

代碼示例:
【ImportPlugin.py】
import importlib
plugin = importlib.import_module(PluginName)
resulit = Plugin.run()
return resulit

擴展插件

插件相當于掃描器的靈魂,也就是核心部分。每款優秀的插件都需要研發或相關人員用心的編寫,基于咱們此種模式,如何編寫插件,需要值得注意的是run()方法作為承上啟下。

代碼示例:
【Scan.py】
def scan(url):
(掃描實現邏輯)
return list
def run(url):
    return scan(url)

域名數據

域名數據屬于掃描器的目標,這類數據需要用戶通過控制器輸入,輸入方式可以分為單例、多例、大量。在單例中用戶直接輸入URL即可執行。在多例中用戶需要輸入URL,每個URL以逗號分隔,通過分隔函數將URL字符串轉化列表,通過列表傳遞域名數據。在大量中建議使用文本存取或數據庫存取的方式,每一行為單個域名。同樣讀取后通過列表傳遞域名數據。

任務生成器

任務生成器能夠將讀取到的域名數據轉換為任務列表或者任務隊列以及任務鏈表進行存儲,這種方式方便用于任務調度,任務調度包含任務啟動、任務定時等等。實現方法并不唯一,需要根據業務需求或實際情況設計數據存儲結構。生成的每項任務需要有獨立且唯一的編號或特征,這樣才能在之后的流程中方便控制。

任務調度器

在任務調度時,要獲得當前能夠加載的插件列表以及任務列表。通過任務分配的方式將兩者進行結合。Python已經有比較好用的插件,例如apscheduler或者huey等等。咱們在研發時追求使用比較方便推薦使用huey,但若穩定性要求較高則推薦apscheduler。任務調度器實現,將兩者列表通過調度器分配執行。對于huey的使用進行簡單演示。

代碼示例:
【Huey.py】
from huey import RedisHuey, crontab
huey = RedisHuey('my-app', host='redis.myapp.com')
@huey.task()
def add_numbers(a, b):
    return a + b
@huey.task(retries=2, retry_delay=60)
def flaky_task(url):
    # This task might fail, in which case it will be retried up to 2 times
    # with a delay of 60s between retries.
    return this_might_fail(url)
@huey.periodic_task(crontab(minute='0', hour='3'))
def nightly_backup():
    sync_all_data()

日志輸出

每次個步驟執行之后,都應該有良好的日志輸出,這樣如果某流程出現問題,方便定位問題。推薦使用logging模塊。

代碼示例:
import logging
logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(levelname)s-%(message)s')
try:
(關鍵邏輯)
except Exception as e:
logger.warning(“告警信息”,e)
else:
logger.info(“提示信息”)

控制器

對于整體的流程進行控制,起到中轉的作用的同時也將掃描器的執行結果進行輸出。模塊所涉及的只有各個模塊之間的調用邏輯關系,就不再老生常談。

總結

輕量級插件掃描器的邏輯功能咱們已經進行闡述和了解,它的優勢在于研發難度低、研發速度快,但是不足之處檢測邏輯全依靠于插件對于插件研發者功底要求較高,這種模型覺得比較適合中小型工具開發和維護。對于商業插件掃描器,還需要進一步研究和討論。

2

發表評論

已有 7 條評論

取消
Loading...

填寫個人信息

姓名
電話
郵箱
公司
行業
職位
css.php 什么app能玩二人麻将