tsc-security/py-url-security

GitHub: tsc-security/py-url-security

一个严格防 SSRF 的 Python URL 验证与安全 HTTP 请求库,通过 DNS 解析验证和 IP 锚定机制防止服务器端请求伪造攻击。

Stars: 1 | Forks: 0

# py-url-security 严格且防 SSRF 的 URL 验证及 Python 出站 HTTP 辅助库。 `py-url-security` 在发起请求前会对 URL 进行验证和解析,阻止非公有网络访问,将连接锚定到预验证的 IP,并强制执行响应大小限制。 ## 功能特性 - 仅允许 `http` 和 `https`。 - 仅允许端口 `80` 和 `443`。 - 拒绝嵌入凭据、片段、路径参数和控制字符。 - 拒绝私有/内部/回环/链路本地/多播/保留 IP 目标。 - 先进行 DNS 解析,验证每个解析地址,然后连接到锚定 IP。 - 支持可配置限制的安全重定向处理。 - 设置响应体大小上限以避免无限内存增长。 ## 环境要求 - Python `3.11+` - Poetry `1.8+` - Make ## 安装 ``` poetry install ``` ## 快速开始 ``` from url_security import UrlSecurity, UnsafeUrlError url = "https://example.com" if UrlSecurity.is_safe(url): response = UrlSecurity.fetch(url) print(response.status, response.final_url, response.remote_ip) else: print("Unsafe URL") try: target = UrlSecurity.resolve("https://example.com/path?q=1") print(target.hostname, target.addresses) except UnsafeUrlError as exc: print(f"Rejected: {exc}") ``` ## API ### `UrlSecurity.is_safe(url: str) -> bool` 当 URL 通过策略验证和 DNS/IP 检查时返回 `True`。 这仅是一个预检验证器。请使用 `fetch(...)` 在同一个流程中执行包含 DNS/IP 验证和锚定连接的实际请求。 ### `UrlSecurity.resolve(url: str) -> ResolvedTarget` 解析并验证 URL,然后返回规范的 `ResolvedTarget`: - `url` - `scheme` - `hostname` - `port` - `path_and_query` - `addresses`(已验证的公有 IP) ### `UrlSecurity.fetch(...) -> SafeHttpResponse` 使用锚定地址和感知策略的重定向执行安全请求。 主要参数: - `method`:HTTP 方法(默认:`GET`) - `headers`:可选的请求头 - `body`:可选的原始请求体 - `timeout`:单次请求超时时间(秒) - `max_redirects`:重定向限制 - `max_response_bytes`:响应大小上限 - `allow_redirects`:启用/禁用跟随重定向 返回一个 `SafeHttpResponse`: - `status` - `reason` - `headers` - `body` - `final_url` - `remote_ip` - `redirect_count` 响应头通过不区分大小写的映射暴露,键为小写的 header 名称,将重复项保留为元组: `Mapping[str, tuple[str, ...]]`。 ## 异常 - `SafeHttpError`:基础请求/传输失败。 - `UnsafeUrlError`:URL/DNS/IP 策略违规。 - `RedirectPolicyError`:无效或过多的重定向。 - `ResponseTooLargeError`:body 超出配置限制。 ## 开发 使用 `Makefile` 作为主要接口: ``` make ``` ### 显示可用目标 ``` make help ``` ### 运行测试 ``` make test ``` ### 仅运行单元测试 ``` make test-unit ``` ### 运行集成测试(真实公有主机) ``` make test-integration ``` 集成测试是可选的,并依赖于外部网络/DNS。它们针对安全的公有主机,例如 `google.com`、`apple.com` 和 `microsoft.com`。 `make test-integration` 目标以跨平台的方式(Linux/macOS/Windows)启用集成模式。 ### 运行覆盖率报告 ``` make coverage ``` `make coverage` 强制执行至少 `90%` 的覆盖率,低于该阈值将失败。 ### Lint 和格式化 ``` make lint make lint-fix make format make format-check ``` ### 推荐的本地质量门禁 ``` make quality ``` ## 本项目的 Ruff 策略 Ruff 在 `pyproject.toml` 中配置了: - 通过 `ruff format` 进行格式化 - 针对正确性、风格、导入、简化和 docstrings 的 Lint 家族 - Pydocstyle 规范与 PEP 257 对齐 - 为了提高测试可读性,有意放宽了测试 docstring 检查
标签:API密钥检测, CISA项目, DNS重绑定防护, IP绑定, Python 3, SSRF防护, URL验证, XML 请求, 安全开发, 安全编码, 开源安全工具, 漏洞缓解, 白名单, 网络安全, 请求过滤, 输入验证, 逆向工具, 逆向工程平台, 隐私保护