reginaldbaraza-code/playwright-security-scanner

GitHub: reginaldbaraza-code/playwright-security-scanner

基于 pytest 和 Playwright 构建的自动化 Web 应用安全测试套件,将常见安全配置错误转化为可在 CI 中运行的自动化测试。

Stars: 0 | Forks: 0

# Playwright 安全扫描器 🔍 基于 pytest 构建的自动化安全测试套件。用于扫描 Web 应用中大多数团队从未为其编写过测试的常见安全配置错误 —— 缺失的标头、不安全的 cookie、开放重定向、表单漏洞以及信息泄露。 其核心理念是:许多安全问题本质上只是**没人编写的测试用例**。缺少 `X-Frame-Options`?这是一个测试。Session cookie 没有 `HttpOnly`?这是一个测试。500 响应中包含堆栈跟踪?这也是一个测试。本项目将 OWASP 最佳实践转化为可在 CI 中运行的自动化测试。 ## 检查内容 | 扫描器 | 检查目标 | 严重程度示例 | |---------|------------------|-------------------| | **Headers** (`scanners/headers.py`) | 缺失 CSP、HSTS、X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy。标记不安全的 CSP 指令和服务器版本泄露。 | 缺失 CSP = 高危,unsafe-eval = 高危 | | **Cookies** (`scanners/cookies.py`) | Session cookie 缺失 Secure/HttpOnly/SameSite 标志。过于宽泛的域名作用域。SameSite=None 但缺失 Secure。 | Session cookie 缺失 HttpOnly = 高危 | | **Redirects** (`scanners/redirects.py`) | 重定向参数(next、redirect_url、goto 等)中的外部 URL。协议相对重定向。跨域重定向检测。 | 开放重定向 = 中危 | | **Forms** (`scanners/forms.py`) | POST 表单缺失 CSRF token。通过 HTTP 提交的表单 action。密码自动补全。通过 GET 提交敏感数据。 | 缺失 CSRF = 高危 | | **Info Leak** (`scanners/info_leak.py`) | 错误响应(Python、Java、.NET、PHP、Node)中的堆栈跟踪。暴露的 API key、连接字符串、secret。开发者注释。Debug 端点。 | 暴露 API key = 高危 | ## 工作原理 扫描器在运行时不依赖 Playwright —— 它们分析作为普通 Python 对象传入的 HTTP 响应数据(标头、主体、cookie)。这意味着: - **单元测试无需浏览器即可运行** —— 快速、无依赖,非常适合 CI - **Playwright 集成** 是在此基础上的一层薄封装 —— 加载页面,将响应数据传递给扫描器 - 每个发现都包含严重程度、OWASP 参考、CWE ID、证据和修复步骤 ``` pytest fixtures (mock data) │ └── Scanner logic (headers, cookies, forms, etc.) │ └── ScanResult with Finding objects │ └── Assertions in test cases ``` ## 快速开始 ``` git clone https://github.com/reginaldbaraza-code/playwright-security-scanner.git cd playwright-security-scanner pip install -e ".[dev]" # 运行所有 44 个测试 pytest -v ``` ## 直接使用扫描器 ``` from scanners.headers import HeaderScanner scanner = HeaderScanner() result = scanner.scan( url="https://myapp.com", headers={ "Content-Security-Policy": "default-src 'self'; script-src 'unsafe-eval'", "Server": "nginx/1.18.0", # Missing: HSTS, X-Frame-Options, X-Content-Type-Options... }, ) for finding in result.findings: print(f"[{finding.severity.value}] {finding.title}") print(f" Remediation: {finding.remediation}") ``` ## 项目结构 ``` playwright-security-scanner/ ├── scanners/ │ ├── models.py # Finding, Severity, ScanResult dataclasses │ ├── headers.py # 6 required headers + CSP quality + version disclosure │ ├── cookies.py # Secure, HttpOnly, SameSite, domain scope checks │ ├── redirects.py # Open redirect detection via URL parameter analysis │ ├── forms.py # CSRF tokens, HTTPS actions, autocomplete, GET method │ └── info_leak.py # Stack traces, secrets, debug endpoints, comments ├── tests/ │ ├── test_headers.py # 9 tests │ ├── test_cookies.py # 9 tests │ ├── test_redirects.py # 7 tests │ ├── test_forms.py # 8 tests │ └── test_info_leak.py # 11 tests └── pyproject.toml ``` ## 技术栈 - **Python 3.11+** - **Playwright** —— 浏览器自动化(用于集成模式) - **Flask** —— 用于扫描器测试的模拟易受攻击应用 - **pytest** —— 44 个测试,全部在无浏览器环境下通过 ## 许可证 MIT
标签:Playwright, pytest, Python, Web安全, 安全测试, 安全规则引擎, 攻击性安全, 无后门, 特征检测, 蓝队分析, 逆向工具