📦 Argus — The Hundred-Eyed — 阿耳戈斯 —— 百眼巨人
v1.0.0Argus — 百眼巨人。扫描您的Python或JavaScript代码库,以查找错误、安全漏洞、代码异味和常见的反模式 — 获取优先...
运行时依赖
安装命令
点击复制技能文档
🐛 👁️ Argus — 代码智能扫描器 静态分析您的代码库 —— 找到真正的 bug、安全漏洞和代码异味,在它们影响生产环境之前。 无需外部 API。支持 Python 和 JavaScript 文件。 您将获得: 硬编码的密码、API 密钥和令牌被标记为 Critical SQL 注入和原型污染检测 Bare except、可变默认值、通配符导入和其他 13 种模式 按严重性过滤的输出:首先关注 Critical,然后逐步深入 bug_report_[DATE].md + bug_report_[DATE].json,包含完整的修复建议 快速开始 SOURCE_PATH="./src" LANGUAGE="python" SEVERITY_FILTER="high" python skill.py 安全性:仅读取本地文件,不传输任何数据。 步骤 1 —— 安装依赖项 import subprocess, sys subprocess.run([sys.executable,"-m","pip","install","rich","--break-system-packages","--quiet"], check=True) 步骤 2 —— 扫描 Bug import os, re, json from pathlib import Path from datetime import date from rich.console import Console from rich.table import Table from rich.panel import Panel from rich import box console = Console() SRC_PATH = os.environ.get("SOURCE_PATH", ".") LANGUAGE = os.environ.get("LANGUAGE", "auto").lower() SEV_FILTER = os.environ.get("SEVERITY_FILTER", "all").lower() TODAY = date.today() src = Path(SRC_PATH) if not src.exists(): console.print(Panel(f"[red]路径未找到:{SRC_PATH}[/red]", border_style="red")) raise SystemExit(1) console.print(Panel.fit(f"[bold red]🐛 👁️ Argus — 代码智能扫描器[/bold red]\n扫描:[cyan]{SRC_PATH}[/cyan] | 语言:[yellow]{LANGUAGE}[/yellow] | 过滤器:[green]{SEV_FILTER}[/green]", border_style="red")) # 检测语言 def detect_lang(path: Path) -> str: py = len(list(path.rglob(".py") if path.is_dir() else [path] if str(path).endswith(".py") else [])) js = len(list(path.rglob(".js") if path.is_dir() else [path] if str(path).endswith(".js") else [])) if py == 0 and js == 0: return "python" # 默认;用户可以使用 LANGUAGE 环境变量覆盖 return "python" if py >= js else "javascript" lang = LANGUAGE if LANGUAGE != "auto" else detect_lang(src) # Bug 模式 PYTHON_RULES = [ ("PY001", "critical", "security", r"eval\s\(", "eval() 是危险的 —— 执行任意代码", "使用 ast.literal_eval() 进行安全解析"), ("PY002", "critical", "security", r"exec\s\(", "exec() 执行任意字符串", "重构以避免动态代码执行"), ("PY003", "critical", "security", r'password\s=\s["\'][^"\']{3,}', "硬编码的密码", "使用环境变量:os.environ.get('PASSWORD')"), ("PY004", "high", "security", r"pickle\.loads?\(", "pickle.load 在未受信任的数据中是不安全的", "使用 json.loads() 进行安全的反序列化"), ("PY005", "high", "bug", r"except\s:", "Bare except 捕获所有异常,包括 KeyboardInterrupt", "使用 except Exception: 或捕获特定的异常类型"), ("PY006", "high", "bug", r"==\sNone|None\s==", "使用 'is None' 而不是 '== None' —— 可能产生意外的结果", "将 == None 替换为 is None"), ("PY007", "medium", "bug", r"def\s+\w+\(.=\[\]", "可变的默认参数 —— 跨调用共享", "使用 None 作为默认值:def f(x=None): x = x or []"), ("PY008", "medium", "security", r"shell\s=\sTrue", "subprocess 中的 shell=True 是一个命令注入风险", "使用 shell=False 并将参数作为列表传递"), ("PY009", "medium", "smell", r"import \", "通配符导入污染命名空间并隐藏依赖项", "仅导入所需的内容:from module import func"), ("PY010", "low", "smell", r"print\s\(", "print() 留在代码中 —— 可能是调试语句", "使用 logging 模块代替 print 进行生产代码"), ("PY011", "critical", "security", r"(?i)(api_key|api_secret|secret_key|access_token|auth_token)\s=\s[\x27\x22][^\x27\x22]{8,}", "硬编码的 API 密钥或令牌", "存储在环境变量中:os.environ.get('API_KEY')"), ("PY012", "high", "security", r"execute\s\(.%.\)|execute\s\(.\.format\(|execute\s\(.f[\x22\x27]", "可能通过字符串格式化进行 SQL 注入", "使用参数化查询:cursor.execute(sql, (value,))"), ("PY013", "medium", "security", r"open\s\((?![^)\n]\bencoding)[^)\n][\x27\x22]w[\x27\x22]", "文件打开时未指定编码", "添加 encoding='utf-8':open(path, 'w', encoding='utf-8')"), ] JS_RULES = [ ("JS001", "critical", "security", r"eval\s\(", "eval() 执行任意代码", "移除 eval —— 重构逻辑"), ("JS002", "critical", "security", r"innerHTML\s=", "innerHTML 是一个 XSS 向量,如果它包含用户输入", "使用 textContent 或在使用前对输入进行清理"), ("JS003", "high", "bug", r"==\snull|null\s*==", "使用 === null 进行严格的相等检查", "将 == null 替换为 === null"), ("JS004", "high", "bug", r"catc