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安全, 安全测试, 安全规则引擎, 攻击性安全, 无后门, 特征检测, 蓝队分析, 逆向工具