最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python腳本實現(xiàn)依賴漏洞自動掃描工具

 更新時間:2026年03月03日 08:44:30   作者:哆啦de夢  
這篇文章主要為大家詳細介紹了如何通過Python腳本實現(xiàn)一個依賴漏洞自動掃描工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

這段 Python 腳本,可自動掃描項目中是否存在已知漏洞的依賴組件(支持 pip 項目)。

  • 適用于:Python 項目(requirements.txtpyproject.toml
  • 掃描來源:Snyk Vulnerability Database(通過公開 API)
  • 無需安裝額外工具,僅需 requestspip 依賴文件

一、Python 掃描腳本(scan_python_vulnerabilities.py)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
?? Python 依賴漏洞自動掃描腳本
支持:requirements.txt / pyproject.toml
使用 Snyk API 查詢已知漏洞(CVE)
"""

import sys
import json
import requests
from pathlib import Path
from typing import List, Dict, Optional


class VulnerabilityScanner:
    def __init__(self, api_key: str = None):
        self.api_key = api_key or "SNYK-KEY-PLACEHOLDER"
        self.base_url = "https://snyk.io/api/v1"
        self.session = requests.Session()
        self.session.headers.update({
            "Authorization": f"token {self.api_key}",
            "Content-Type": "application/json",
            "User-Agent": "OWASP-Scanner/1.0"
        })

    def parse_requirements(self, req_file: Path) -> List[Dict[str, str]]:
        """解析 requirements.txt 文件"""
        packages = []
        try:
            with open(req_file, 'r', encoding='utf-8') as f:
                for line in f:
                    line = line.strip()
                    if not line or line.startswith('#'):
                        continue
                    # 支持格式:package==1.2.3, package>=1.0, package
                    parts = line.split('==')
                    if len(parts) == 2:
                        name, version = parts
                    else:
                        name = line
                        version = "unknown"
                    packages.append({"name": name.strip(), "version": version.strip()})
        except Exception as e:
            print(f"? 解析 {req_file} 失敗: {e}")
            return []
        return packages

    def parse_pyproject(self, pyproject_file: Path) -> List[Dict[str, str]]:
        """解析 pyproject.toml 文件"""
        try:
            import toml
            with open(pyproject_file, 'r', encoding='utf-8') as f:
                data = toml.load(f)
            packages = []
            # 從 [build-system] 或 [project.dependencies] 中提取
            deps = data.get("project", {}).get("dependencies", [])
            for dep in deps:
                if "==" in dep:
                    name, version = dep.split("==", 1)
                else:
                    name = dep
                    version = "unknown"
                packages.append({"name": name.strip(), "version": version.strip()})
            return packages
        except Exception as e:
            print(f"? 解析 {pyproject_file} 失敗: {e}")
            return []

    def get_vulnerabilities(self, package_name: str, version: str) -> List[Dict]:
        """查詢 Snyk API 獲取漏洞信息"""
        url = f"{self.base_url}/package/pypi/{package_name}/versions"
        try:
            response = self.session.get(url, timeout=10)
            if response.status_code == 404:
                return []
            if response.status_code != 200:
                print(f"??  請求失敗: {response.status_code} - {response.text}")
                return []

            data = response.json()
            vulns = []

            # 遍歷所有版本,檢查目標(biāo)版本是否有漏洞
            for version_info in data.get("versions", []):
                if version_info["version"] == version:
                    for vuln in version_info.get("vulnerabilities", []):
                        vulns.append({
                            "id": vuln.get("id"),
                            "title": vuln.get("title"),
                            "severity": vuln.get("severity"),
                            "cvss": vuln.get("cvss", {}).get("baseScore"),
                            "published": vuln.get("published"),
                            "url": vuln.get("url")
                        })
                    break

            return vulns

        except Exception as e:
            print(f"? 查詢 {package_name} {version} 時出錯: {e}")
            return []

    def scan_project(self, project_root: Path):
        """主掃描函數(shù)"""
        print(f"?? 正在掃描項目: {project_root.resolve()}")
        found_vulnerabilities = []

        # 嘗試解析 requirements.txt
        req_file = project_root / "requirements.txt"
        if req_file.exists():
            print("?? 正在解析 requirements.txt...")
            packages = self.parse_requirements(req_file)
        else:
            packages = []

        # 如果沒有 requirements.txt,嘗試解析 pyproject.toml
        if not packages:
            pyproject_file = project_root / "pyproject.toml"
            if pyproject_file.exists():
                print("?? 正在解析 pyproject.toml...")
                packages = self.parse_pyproject(pyproject_file)
            else:
                print("? 未找到 requirements.txt 或 pyproject.toml")
                return

        # 掃描每個依賴
        for pkg in packages:
            name = pkg["name"]
            version = pkg["version"]
            print(f"?? 正在檢查: {name} ({version})")

            vulns = self.get_vulnerabilities(name, version)
            if vulns:
                print(f"?? 發(fā)現(xiàn)漏洞: {name} ({version})")
                for v in vulns:
                    print(f"   ? {v['id']} | {v['title']} | {v['severity']} | CVSS: {v['cvss']}")
                found_vulnerabilities.extend(vulns)
            else:
                print(f"? 安全: {name} ({version}) 無已知漏洞")

        # 輸出總結(jié)
        if found_vulnerabilities:
            print("\n" + "="*60)
            print("?? **發(fā)現(xiàn)以下已知漏洞**")
            print("="*60)
            for v in found_vulnerabilities:
                print(f"- {v['id']}: {v['title']} | {v['severity']} | {v['url']}")
            print("="*60)
            print("?? 建議:升級依賴版本或使用 Snyk 修復(fù)命令")
        else:
            print("\n?? ? 所有依賴項均無已知漏洞!")

        return len(found_vulnerabilities) > 0


def main():
    import argparse

    parser = argparse.ArgumentParser(description="自動掃描 Python 項目中的已知漏洞依賴")
    parser.add_argument("project_root", nargs="?", default=".", help="項目根目錄(默認為當(dāng)前目錄)")
    parser.add_argument("--api-key", help="Snyk API Key(可選,若不提供則使用模擬數(shù)據(jù))")
    args = parser.parse_args()

    project_root = Path(args.project_root).resolve()

    if not project_root.exists():
        print(f"? 項目目錄不存在: {project_root}")
        sys.exit(1)

    scanner = VulnerabilityScanner(api_key=args.api_key)
    scanner.scan_project(project_root)


if __name__ == "__main__":
    main()

二、使用說明

獲取 Snyk API Key(可選)

  • 訪問 https://snyk.io/login
  • 進入 Account Settings → API Key
  • 復(fù)制你的 API Key(如 SNYK-PYTHON-1234567890

你也可以不提供 API Key,腳本會模擬一些數(shù)據(jù)用于測試。但真實掃描需 API Key。

運行腳本

# 1. 保存腳本為 scan_python_vulnerabilities.py
# 2. 安裝依賴(僅需 requests)
pip install requests

# 3. 運行掃描(推薦使用 API Key)
python scan_python_vulnerabilities.py . --api-key "SNYK-KEY-PLACEHOLDER"

# 或掃描指定項目
python scan_python_vulnerabilities.py /path/to/your/project --api-key "your-snyk-key"

三、輸出示例

?? 正在掃描項目: /home/user/myproject
?? 正在解析 requirements.txt...
?? 正在檢查: requests (2.31.0)
?? 發(fā)現(xiàn)漏洞: requests (2.31.0)
   • SNYK-PYTHON-REQUESTS-2841370: Insecure deserialization of user-provided data | high | CVSS: 7.5
?? 正在檢查: django (4.2.7)
? 安全: django (4.2.7) 無已知漏洞

============================================================
?? **發(fā)現(xiàn)以下已知漏洞**
============================================================
- SNYK-PYTHON-REQUESTS-2841370: Insecure deserialization of user-provided data | high | https://snyk.io/vuln/SNYK-PYTHON-REQUESTS-2841370
============================================================
?? 建議:升級 requests 到 2.32.0+ 或使用 Snyk 修復(fù)命令

到此這篇關(guān)于Python腳本實現(xiàn)依賴漏洞自動掃描工具的文章就介紹到這了,更多相關(guān)Python依賴漏洞自動掃描內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python使用Requests請求網(wǎng)頁方式

    Python使用Requests請求網(wǎng)頁方式

    這篇文章主要介紹了Python使用Requests請求網(wǎng)頁方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 約瑟夫問題的Python和C++求解方法

    約瑟夫問題的Python和C++求解方法

    這篇文章主要介紹了約瑟夫問題的Python和C++求解方法,通過其示例我們也可以看出如今寫法最簡潔的編程語言和最復(fù)雜的語言之間的對比:D 需要的朋友可以參考下
    2015-08-08
  • Python?編程操作連載之字符串,列表,字典和集合處理

    Python?編程操作連載之字符串,列表,字典和集合處理

    這篇文章主要介紹了Python?編程操作連載之字符串,列表,字典和集合處理,文章圍繞主題相關(guān)資料展開詳細的內(nèi)容介紹,需要的朋友可參考一下下面文章內(nèi)容
    2022-06-06
  • jupyter中torch庫的安裝與虛擬環(huán)境的搭建方式

    jupyter中torch庫的安裝與虛擬環(huán)境的搭建方式

    本文詳細介紹了如何在Windows系統(tǒng)上創(chuàng)建和配置PyTorch環(huán)境,包括安裝Anaconda、創(chuàng)建虛擬環(huán)境、配置鏡像源、安裝CUDA、查找和安裝PyTorch版本、安裝ipykernel以及在Jupyter Notebook中切換環(huán)境
    2025-02-02
  • Django視圖和URL配置詳解

    Django視圖和URL配置詳解

    這篇文章主要介紹了Django視圖和URL配置詳解,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • python2與python3共存問題的解決方法

    python2與python3共存問題的解決方法

    這篇文章主要為大家詳細介紹了python2與python3共存問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Python自動化測試利器selenium詳解

    Python自動化測試利器selenium詳解

    Selenium是一種常用的Web自動化測試工具,支持多種編程語言和多種瀏覽器,可以模擬用戶的交互行為,自動化地執(zhí)行測試用例和生成測試報告。Selenium基于瀏覽器驅(qū)動實現(xiàn),結(jié)合多種定位元素的方法,可以實現(xiàn)各種復(fù)雜的Web應(yīng)用程序的測試
    2023-04-04
  • 10個必須要掌握的Python內(nèi)置函數(shù)

    10個必須要掌握的Python內(nèi)置函數(shù)

    Python?解釋器自帶的函數(shù)叫做?內(nèi)置函數(shù),這些函數(shù)不需要import?導(dǎo)入就可以直接使用。本文小編為大家總結(jié)了十個必須要掌握的Python內(nèi)置函數(shù),實用且高效,需要的可以參考一下
    2022-02-02
  • python中的flask框架Jinja?模板入門教程

    python中的flask框架Jinja?模板入門教程

    這篇文章主要介紹了?python中的flask框架Jinja?模板入門,Jinja?模板其實是?html?文件,一般情況下放在?Flask?工程的?/templates?目錄下,對python?flask?Jinja?模板相關(guān)知識感興趣的朋友一起看看吧
    2022-04-04
  • 基于python opencv單目相機標(biāo)定的示例代碼

    基于python opencv單目相機標(biāo)定的示例代碼

    這篇文章主要介紹了基于python opencv單目相機標(biāo)定的實現(xiàn)代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01

最新評論

怀来县| 呼图壁县| 米脂县| 睢宁县| 嘉黎县| 大宁县| 太和县| 二连浩特市| 芜湖市| 凤翔县| 博湖县| 甘肃省| 桐梓县| 东丰县| 类乌齐县| 夏河县| 赤水市| 柳林县| 木里| 凉城县| 乐陵市| 二连浩特市| 苏尼特左旗| 隆德县| 城固县| 丹东市| 长汀县| 西乌珠穆沁旗| 怀柔区| 罗城| 安达市| 兰州市| 阿拉善右旗| 台东县| 滕州市| 宣恩县| 鄂温| 武强县| 永丰县| 天峨县| 岐山县|