項目地址
凱爾后端:https://github.com/Mrshenxh/Kayle
項目技術(shù)選型
項目后端技術(shù)選型為python Flask框架签舞,主要特點小而輕,原生組件幾乎為0觅捆,契合項目限制為企業(yè)內(nèi)部使用的初衷辰妙。
優(yōu)點如下:
簡單,F(xiàn)lask的路由以及路由函數(shù)由修飾器設(shè)定侥猩,開發(fā)人員不需要借助其他文件匹配架曹;
配置靈活隘冲,有多種方法配置,不同環(huán)境的配置也非常方便绑雄;環(huán)境部署簡單展辞,F(xiàn)lask運行不需要借助其他任何軟件,只需要安裝了Python的IDE万牺,在命令行運行即可罗珍。只需要在Python中導入相應包即可滿足所有需求;
入門簡單脚粟,通過官方指南便可以清楚的了解Flask的運行流程覆旱;
低耦合,F(xiàn)lask可以兼容多種數(shù)據(jù)庫核无、模板扣唱。
項目結(jié)構(gòu)
app/config:項目配置文件夾,包含以下重要內(nèi)容:
1团南、mysql相關(guān)信息(地址噪沙,端口,用戶名和密碼)
2吐根、DB(集成flask_sqlalchemy和mysql更方便的交互)
3正歼、celery配置信息(URL,BACKEND)
4、SECRET_KEY(加密使用)
5拷橘、user_socket_dict(自定義一個全局socket dict局义,存儲用戶和mitmproxy上傳socket)
app/logs:項目log文件位置,包括celery日志冗疮,gunicorn日志萄唇,后續(xù)接入logging
app/models:應用model層,包括用戶赌厅,計劃穷绵,核心接口等model
app/statics:靜態(tài)文件存儲地址
app/templates:html模版存儲地址轿塔,因為項目為前后端分離特愿,所以暫時沒用到
app/utils:公共方法存儲地仲墨,后續(xù)優(yōu)化擴展
app/views:應用view層,基于藍圖實現(xiàn)route引入
app/__init__.py:應用初始化文件揍障,初始化重要組件目养,如app,MCelery毒嫡,flask_login回調(diào)函數(shù)等
venv:python虛擬環(huán)境癌蚁,進入虛擬環(huán)境命令:source venv/bin/active
gunicorn.conf.py:gunicorn配置文件,關(guān)于gunicorn請參考項目部署
qa_tools_be.py:基于geventwebsocket的執(zhí)行啟動文件
requirement.txt:python資源文件兜畸。通過 pip install -r requirements.txt 拉取項目依賴的python第三方努释;通過 pip freeze > requirements.txt生成項目本地資源列表文件。
業(yè)務結(jié)構(gòu)
根據(jù)上面的項目結(jié)構(gòu)可以了解到咬摇,項目的主要業(yè)務模塊主要在model層以及view層伐蒂。下面針對這兩個模塊的對應業(yè)務表和接口再做具體介紹。
model層:
history_plan_model:
歷史計劃模型肛鹏,對應history_plan_list?數(shù)據(jù)庫表逸邦。可根據(jù)ID查找相關(guān)數(shù)據(jù)在扰。
temp_interface_model:
CoreInterface:核心接口模型缕减,對應core_interface_list?數(shù)據(jù)庫表∶⒅椋可根據(jù)?interface_id?查找相關(guān)數(shù)據(jù)悍缠。
TempUserPort:臨時端口模型,對應 temp_mitmproxy_list 數(shù)據(jù)庫表缰趋〔该校可根據(jù)user_id,port和mitm_id查找相關(guān)數(shù)據(jù)
user_model:
用戶模型好爬,對應user_list?數(shù)據(jù)庫表局雄。可根據(jù)user_id查找相關(guān)數(shù)據(jù)存炮。
view層:
user:
user/login:登錄
user/register: 注冊
user/message: 查詢用戶詳細信息
user/checklogin: 校驗是否處于登錄狀態(tài)
user/logout: 退出登錄
tempinter:
tempinter/queryportmsg: 根據(jù)port查詢 temp_mitmproxy_list數(shù)據(jù)庫表內(nèi)對應的數(shù)據(jù)(不校驗登錄狀態(tài))
tempinter/queryusersocket: 查詢當前用戶是否有已經(jīng)使用的mitmproxy代理
tempinter/uploadcoreinter: 核心接口上傳
tempinter/createmitm: 創(chuàng)建mitmproxy代理
tempinter/stopmitm: 關(guān)閉mitmproxy代理
tempinter/tempsocket/flow/<usermessage>: websocket數(shù)據(jù)流傳輸
tempinter/getcoreinter: 分頁下發(fā)核心接口
tempinter/searchcore:?根據(jù)interface_id查詢接口詳細信息
tempinter/deletecore: 根據(jù)interface_id刪除核心接口
tempinter/editcore: 二次編輯核心接口
plan:
plan/createplan: 計劃創(chuàng)建
plan/stopplan: 關(guān)閉計劃
plan/queryplan: 計劃創(chuàng)建成功后炬搭,查詢計劃
plan/queryplancore: 計劃創(chuàng)建成功后,查詢計劃模塊對應的核心接口
plan/historyplan: 歷史計劃列表
plan/deletehistoryplan: 刪除某個歷史計劃
plan/historyplan/<id>: 查看某個歷史計劃的詳細數(shù)據(jù)
operator:
operator/scanplan: 觸發(fā)掃描計劃是否結(jié)束場景
operator/scanmitm: 觸發(fā)掃描mitmproxy代理
其他
項目環(huán)境基于python3穆桂;
創(chuàng)建計劃宫盔,會將task推送到celery任務隊列中∠硗辏可以通過plan/queryplan 查看task執(zhí)行情況灼芭,也可以在redis上根據(jù)鍵值對查詢;
進行中計劃的數(shù)據(jù)般又,存儲在redis中彼绷。對應hash為“plan_core”巍佑,具體邏輯可參考app/utils/redis_operat.py 文件;
關(guān)于mitmproxy
mitmproxy是一款類似于Charles的代理工具寄悯,官網(wǎng)參考:https://www.mitmproxy.org/萤衰。
啟動mitmproxy,用mitmproxy猜旬、mitmdump脆栋、mitmweb都可以,區(qū)別如下:
mitmproxy?命令啟動后洒擦,會提供一個命令行界面椿争,用戶可以實時看到發(fā)生的請求,并通過命令過濾請求熟嫩,查看請求數(shù)據(jù)丘薛;
mitmweb?命令啟動后,會提供一個 web 界面邦危,用戶可以實時看到發(fā)生的請求洋侨,并通過 GUI 交互來過濾請求,查看請求數(shù)據(jù)倦蚪;
mitmdump?命令啟動后希坚,沒有界面,程序默默運行陵且,所以 mitmdump 無法提供過濾請求裁僧、查看數(shù)據(jù)的功能,只能結(jié)合自定義腳本慕购,默默工作聊疲;
這里我們操作mitmdump進行代理創(chuàng)建,執(zhí)行命令為:mitmdump -s kayle_be/app/utils/get_mitm_request.py?-p {端口號}
服務器mitmproxy證書安裝:
在服務器上沪悲,我們也要安裝mitmproxy對應證書:
cd ~/.mitmproxy
# 證書格式轉(zhuǎn)換
openssl x509 -in mitmproxy-ca-cert.pem -inform PEM -out mitmproxy-ca-cert.crt
sudo mkdir /usr/share/ca-certificates/extrasudo cpmitmproxy-ca-cert.crt/usr/share/ca-certificates/extra/mitmproxy-ca-cert.crt
# 無交互模式
sudo update-ca-certificates
腳本執(zhí)行原理:
在執(zhí)行命令中获洲,我們指定了端口和腳本,那么每次有接口數(shù)據(jù)流轉(zhuǎn)過來時殿如,都會執(zhí)行一遍get_mitm_request.py腳本贡珊,在腳本中,我們收集了接口請求和返回的數(shù)據(jù)涉馁,并把這些數(shù)據(jù)打給websocket接口门岔,由websocket接口傳遞給current_user前端