剖析:一個(gè)單文件爬蟲工具的代碼設(shè)計(jì)與實(shí)現(xiàn)思路)
GitPrey 源碼架構(gòu)剖析一個(gè)單文件爬蟲工具的代碼設(shè)計(jì)與實(shí)現(xiàn)思路【免費(fèi)下載鏈接】GitPreySearching sensitive files and contents in GitHub associated to company name or other key words項(xiàng)目地址: https://gitcode.com/gh_mirrors/gi/GitPreyGitPrey 是一個(gè)基于關(guān)鍵詞的 GitHub 敏感信息掃描工具它能按企業(yè)名或指定關(guān)鍵詞搜索代碼庫(kù)找出其中泄露的敏感文件與敏感代碼內(nèi)容。整個(gè)掃描器的核心邏輯只寫在約 284 行的 GitPrey.py 單文件中堪稱單文件爬蟲的極簡(jiǎn)范本。本文帶你剖析它的源碼架構(gòu)三階段掃描流水線如何搭建、為什么放棄官方 API 改爬網(wǎng)頁(yè)、外部化模式庫(kù)又是如何設(shè)計(jì)的。 項(xiàng)目速覽一個(gè)文件撐起整個(gè)掃描器GitPrey 的工作目標(biāo)很明確輸入一個(gè)關(guān)鍵詞比如公司名輸出所有可能泄露敏感信息的倉(cāng)庫(kù)、文件和代碼行。它的技術(shù)選型非常克制只依賴 4 個(gè)第三方庫(kù)依賴用途requests發(fā)送 HTTP 請(qǐng)求、模擬登錄BeautifulSoup解析搜索結(jié)果網(wǎng)頁(yè)lxml提供 HTML 解析引擎colorama終端彩色輸出全部核心邏輯登錄、檢索、解析、過濾、輸出集中在GitPrey.py的GitPrey類中第 44 行起這也是理解整個(gè)架構(gòu)的關(guān)鍵入口。 目錄結(jié)構(gòu)核心邏輯只在一個(gè)文件里項(xiàng)目目錄小而清晰每個(gè)文件職責(zé)單一GitPrey/ ├── GitPrey.py # 主程序掃描器核心邏輯單文件 ├── config/ # 配置包用戶在此放入自己的 Config.py ├── include/ │ └── ColorPrint.py # 彩色打印 文件日志模塊 └── pattern/ ├── path.db # 敏感文件名列表如 htpasswd、netrc ├── file.db # 內(nèi)容搜索的文件范圍如 config、secret └── info.db # 敏感內(nèi)容關(guān)鍵詞如 password、pwd幾個(gè)值得注意的設(shè)計(jì)config/目錄出廠只帶一個(gè)空的__init__.py用戶需要自行創(chuàng)建Config.py填入 GitHub 賬號(hào)密碼。這樣設(shè)計(jì)避免了示例配置被誤提交也降低了主程序?qū)唧w配置的耦合。pattern/目錄把掃描什么從怎么掃描中剝離后面會(huì)詳細(xì)講這種數(shù)據(jù)與邏輯分離的好處。?? 三階段掃描流水線核心架構(gòu)GitPrey 的整體架構(gòu)是一條三段式流水線每一段的輸出都是下一段的輸入關(guān)鍵詞項(xiàng)目檢索→敏感文件名掃描→敏感內(nèi)容掃描第一階段按關(guān)鍵詞圈定疑似項(xiàng)目入口是GitPrey類的search_project()方法GitPrey.py第 66 行。它構(gòu)造的搜索查詢是{keyword} in:file,path即代碼內(nèi)容或文件路徑中出現(xiàn)該關(guān)鍵詞。這里有兩個(gè)精巧的細(xì)節(jié)去重每頁(yè)結(jié)果先經(jīng)set()去重累加進(jìn)unique_project_list迭代排除找到一批倉(cāng)庫(kù)后把它們拼成-repo:xxx -repo:yyy追加到查詢里再查第一頁(yè)——因?yàn)橐寻l(fā)現(xiàn)的倉(cāng)庫(kù)被排除第一頁(yè)永遠(yuǎn)是新鮮結(jié)果這樣巧妙地繞開了 GitHub單次搜索最多 1000 條的硬性上限。第二階段敏感文件名掃描project_miner()函數(shù)第 255 行把第一階段找到的所有倉(cāng)庫(kù)拼成repo:xxx repo:yyy ...字符串再交給sensitive_info_query()第 101 行。filename 模式下程序讀取pattern/path.db中的 41 個(gè)敏感文件名如htpasswd、netrc、bash_history、private.key拼成filename:xxx filename:yyy與倉(cāng)庫(kù)條件做隱式 AND 組合讓 GitHub 只在這些倉(cāng)庫(kù)里找這些高危文件。第三階段敏感內(nèi)容掃描與逐行正則過濾content 模式的流程更精細(xì)在__file_content_inspect()方法第 122 行中從pattern/info.db讀取敏感詞password、pwd、private_key 等由于 GitHub 單次搜索的 OR 操作符最多 5 個(gè)程序用math.floor(len/5)1做分批輪詢每 5 個(gè)詞查一輪命中文件后把頁(yè)面鏈接的 host 從 GitHub 換成 raw 地址第 134 行的replace(HOST_NAME, RAW_NAME)直接拉取原始文件內(nèi)容在本地對(duì)每一行做正則匹配re.search忽略大小寫只輸出真正包含敏感詞的那幾行代碼。服務(wù)端粗篩 客戶端精篩的組合既省流量又提高了準(zhǔn)確率。 關(guān)鍵設(shè)計(jì)決策剖析為什么放棄官方 API選擇爬網(wǎng)頁(yè)這是全文最值得學(xué)習(xí)的一個(gè)決策README 里給出了兩個(gè)量化理由代碼搜索 API 認(rèn)證后限流30 次/分鐘根本跑不完批量掃描API 單頁(yè)最多返回100 條而網(wǎng)頁(yè)端可達(dá)1000 條總召回量差一個(gè)數(shù)量級(jí)。所以當(dāng) API 能力不匹配場(chǎng)景時(shí)退而求其次地爬 Web 頁(yè)面反而是更工程化的選擇。自動(dòng)登錄繞開 429 限制未登錄狀態(tài)下快速翻頁(yè)約 10 頁(yè)就會(huì)觸發(fā)429 Too Many Requests。__auto_login()方法第 192 行模擬瀏覽器完成登錄先 GET 登錄頁(yè)收集全部隱藏表單字段再帶上賬號(hào)密碼 POST并把 session cookies 交給后續(xù)所有請(qǐng)求。登錄失敗會(huì)直接報(bào)錯(cuò)退出而不是帶著半殘的會(huì)話繼續(xù)跑。此外__get_page_html()第 207 行對(duì) 429 狀態(tài)碼有兜底休眠后重試連接錯(cuò)誤給出明確提示讀超時(shí)返回空串讓上層自然跳過。防御性編程貫穿始終。五級(jí)掃描深度速度與召回的權(quán)衡第 38 行的一行常量定義了全部深度策略SCAN_DEEP [10, 30, 50, 70, 100]Level 1 到 Level 5 對(duì)應(yīng)檢索最近索引的前 10~100 頁(yè)代碼結(jié)果這個(gè)數(shù)字同時(shí)復(fù)用為請(qǐng)求超時(shí)秒數(shù)——一個(gè)配置項(xiàng)承擔(dān)兩個(gè)職責(zé)簡(jiǎn)單但實(shí)用。官方建議掃描深度與掃描周期正相關(guān)Level 1 適合每天掃Level 5 可放寬周期。? 外部化模式庫(kù)三個(gè) pattern 文件的分工GitPrey 把掃什么完全交給pattern/目錄下的三個(gè)純文本文件每行一個(gè)條目文件作用示例條目pattern/path.db敏感文件名掃描第二階段htpasswd、netrc、pgpasspattern/file.db限定內(nèi)容搜索的文件范圍config、credential、secretpattern/info.db敏感內(nèi)容關(guān)鍵詞第三階段password、pwd、user讀取邏輯只有 8 行——__pattern_db_list()方法第 173 行逐行讀入即可。這意味著普通用戶不改一行代碼就能擴(kuò)展掃描規(guī)則往path.db里加一行myservice.conf下次掃描就多盯一個(gè)文件。這是配置即數(shù)據(jù)最直觀的收益。 輔助模塊ColorPrint 與命令行入口include/ColorPrint.py把怎么顯示從主邏輯中拆了出來提供 5 個(gè)語義化函數(shù)error_print紅色——錯(cuò)誤info_print綠色——進(jìn)度信息project_print青色——項(xiàng)目信息file_print黃色——命中文件code_print白色——命中代碼行更妙的是第 16~20 行模塊初始化時(shí)掛了一個(gè)FileHandler所有打印同步落盤到 GitPrey.log。終端看著是彩色進(jìn)度條實(shí)際已是一份完整審計(jì)日志幾乎零成本實(shí)現(xiàn)了所見即所記。命令行入口init()函數(shù)第 229 行用 argparse 只暴露兩個(gè)參數(shù)-l搜索深度1~5、-k關(guān)鍵詞必填并用正則做關(guān)鍵詞合法性校驗(yàn)——配置項(xiàng)從配置文件挪到命令行正是 v2.2 版本的一次重要簡(jiǎn)化。 新手可借鑒的 4 個(gè)設(shè)計(jì)思路單文件不等于單職責(zé)糊在一起一個(gè)文件里仍按檢索 → 掃描 → 輸出嚴(yán)格分層方法命名search_project/sensitive_info_query自解釋數(shù)據(jù)與邏輯分離掃描規(guī)則放在.db文本文件擴(kuò)展規(guī)則零代碼改動(dòng)展示與業(yè)務(wù)分離換一套輸出風(fēng)格只需替換 ColorPrint 模塊防御性兜底缺依賴友好報(bào)錯(cuò)、429 重試、登錄失敗快速退出每一步異常都有歸宿。也要理解它的邊界README 中坦誠(chéng)列出GitHub 只索引默認(rèn)分支、單次搜索上限 1000 條、僅檢索 384KB 以下的文件——因此結(jié)果可能存在漏報(bào)關(guān)鍵詞未進(jìn)路徑/內(nèi)容或誤報(bào)第三方倉(cāng)庫(kù)恰好引用了關(guān)鍵詞把它當(dāng)作線索發(fā)現(xiàn)器而非審計(jì)終審工具才符合定位。 獲取并運(yùn)行 GitPreygit clone https://gitcode.com/gh_mirrors/gi/GitPrey cd GitPrey pip install requests beautifulsoup4 lxml colorama隨后在config/下創(chuàng)建Config.py填入 GitHub 賬號(hào)登錄態(tài)是規(guī)避 429 的前提即可運(yùn)行python GitPrey.py -k 你的關(guān)鍵詞 -l 1從進(jìn)度條到彩色報(bào)告你會(huì)看到三階段流水線依次執(zhí)行——而這背后全部架構(gòu)就藏在那個(gè)不到 300 行的文件里。總結(jié)GitPrey 的架構(gòu)魅力在于用最小代碼量解決了一個(gè)多階段問題單文件承載檢索、解析、過濾全鏈路pattern 庫(kù)承載掃描規(guī)則ColorPrint 承載展示。它給新手的核心啟示是——架構(gòu)清晰不取決于文件數(shù)量而取決于職責(zé)邊界是否干凈。讀懂這一個(gè)文件你就讀懂了爬蟲類工具最常見的骨架登錄態(tài)維護(hù)、分頁(yè)檢索、HTML 解析、本地精篩與結(jié)果落盤?!久赓M(fèi)下載鏈接】GitPreySearching sensitive files and contents in GitHub associated to company name or other key words項(xiàng)目地址: https://gitcode.com/gh_mirrors/gi/GitPrey創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考