如何为 theHarvester HarvestView 自托管 Tabulator 静态资源以支持隔离网络
【免费下载链接】theHarvesterE-mails, subdomains and names Harvester - OSINT项目地址: https://gitcode.com/GitHub_Trending/th/theHarvester
HarvestView 是 theHarvester 的浏览器端运行工作台。它的结果表和 Schedules 调度表依赖 Tabulator 6.5.2 表格组件,而页面默认从 CDNjs 加载这两个资源。当 theHarvester 部署在没有公网出口的机器上时,页面本身能打开,但 Tabulator 的样式和脚本会加载失败,表格无法渲染。安装文档 的 “Self-host Tabulator” 一节给出了对应做法:在联网环境下载同一版本的固定资源文件,放入 HarvestView 的静态目录,把页面里的 CDNjs 引用换成同源路径,再重新构建包或容器。
需要替换的资源与默认状态
HarvestView 的默认状态在仓库中可以直接核对:
- 页面模板引用的是 CDNjs 上固定为 6.5.2 的 Tabulator:index.html 的
<link>(第 9 行)、body 末尾的<script>(第 405 行),以及 schedules.html 中同样两个标签(第 9、209 行)。三个位置都带integrity、crossorigin、referrerpolicy属性。 - 静态资源由服务从
theHarvester/lib/api/static目录挂载在/static下(见 api.py 中的app.mount('/static', StaticFiles(...)))。所以只要把文件放进theHarvester/lib/api/static/harvestview/,就会以/static/harvestview/...同源提供。 - 改动前这两个同源路径并不存在:仓库测试用例断言默认状态下请求
/static/harvestview/tabulator.min.css和/static/harvestview/tabulator.min.js都返回 404(tests/lib/test_harvestview_ui.py)。
文档给出的固定文件清单及其来源(URL 与 SRI 值原样来自安装文档的表格):
| File | CDNjs source | SRI |
|---|---|---|
tabulator.min.css | https://cdnjs.cloudflare.com/ajax/libs/tabulator-tables/6.5.2/css/tabulator.min.css | sha512-t8I/asqzdu/MRgVLxVanQ/c5bhUA1qZ/zA432a/3nUh0kkd7P8Qch35wQvTODivf9D6Xv3h7F8p7ezcUyBOQrQ== |
tabulator.min.js | https://cdnjs.cloudflare.com/ajax/libs/tabulator-tables/6.5.2/js/tabulator.min.js | sha512-AF0YMSgc0Ui4IJPb4hJNSi16wFidZEQa6ZTCAeguF3h5glVnAPuz/JT2ai9ypKhsc9n6CEXBB+tMdxsv1q+rxg== |
表中 SRI 值就是页面原始标签上integrity属性使用的值,可以用来核对下载产物与固定版本一致。
在联网环境下载并放入静态目录
在能访问公网的机器上下载这两个文件。使用curl -fO时保存的文件名就是 URL 末段,即tabulator.min.css和tabulator.min.js,与文档要求的目标文件名一致:
curl -fO https://cdnjs.cloudflare.com/ajax/libs/tabulator-tables/6.5.2/css/tabulator.min.css curl -fO https://cdnjs.cloudflare.com/ajax/libs/tabulator-tables/6.5.2/js/tabulator.min.js然后把两个文件复制进部署用的 theHarvester 源码树中的theHarvester/lib/api/static/harvestview/目录。这是文档明确要求的放置位置,文件名不能改动。
把 CDNjs 引用替换为同源引用
编辑theHarvester/lib/api/static/harvestview/index.html,把 head 中的 CDNjs<link>和 body 末尾的 CDNjs<script>替换为同源引用(这两个标签是文档给出的替换形式):
<link rel="stylesheet" href="/static/harvestview/tabulator.min.css?v=6.5.2"> <script src="/static/harvestview/tabulator.min.js?v=6.5.2"></script>同时从这两个本地标签上去掉integrity、crossorigin和referrerpolicy属性——文档说明它们只用于 CDN 场景。
一个文档未明说但需要处理的点:安装文档只提到替换index.html,但 schedules.html 包含同样的两个固定 CDNjs 标签,且仓库测试用例断言/和/schedules两个页面都引用了同一组 CDN 资源(tests/lib/test_harvestview_ui.py)。如果目标网络无法访问 CDNjs,Schedules 页面的调度表同样会加载失败,因此需要对schedules.html做完全相同的替换。
重新构建并启动服务
文档要求复制资源后重新构建包或容器(Rebuild the package or container),两种方式对应如下。
容器部署(Docker Compose):先创建 operator-key 密钥,再带--build重建。以下命令会在宿主机创建.secrets目录(权限0700)和只读密钥文件(0444),并重建、重启容器:
install -d -m 0700 .secrets openssl rand -hex 32 > .secrets/operator-api-key chmod 0444 .secrets/operator-api-key docker compose up --build -d docker compose ps之所以必须重建,是因为 Dockerfile 在构建期把theHarvester/源码树拷入镜像并以非 editable 方式安装theharvester包;只有重新构建,新放入的静态文件和改动后的 HTML 才会进入镜像。镜像启动的是harvestview服务,不提供交互式 theHarvester CLI。
源码部署:theHarvester 需要 Python 3.14,安装后启动服务:
uv sync export THEHARVESTER_API_KEY='replace-with-a-long-random-value' uv run harvestview服务默认绑定127.0.0.1:5000,THEHARVESTER_API_KEY需要替换为一个长随机值。
验证结果
- 页面不再引用 CDN:抓取两个页面的 HTML 并搜索,应无
cdnjs输出:
curl -s http://127.0.0.1:5000/ | grep -c cdnjs curl -s http://127.0.0.1:5000/schedules | grep -c cdnjs- 同源资源可访问:请求
http://127.0.0.1:5000/static/harvestview/tabulator.min.js(以及.css)应返回文件内容。默认状态下这两个路径是 404(仓库测试已核实),返回 200 说明静态挂载已找到你放入的文件。 - 浏览器打开 HarvestView 和 Schedules。提交一次运行后,结果表以 Tabulator 渲染(仓库 e2e 用例即以
.tabulator-row行元素和#dispatch-grid.tabulator可见作为表格渲染的判断,见 tests/e2e/test_harvestview.py),排序、列过滤、分页等行为随之可用。
边界与限制
- 保持默认的 loopback 绑定。安装文档要求不要修改回环端口映射、不要把服务直接暴露给不受信任的网络;需要远程访问时先加 TLS 和网络访问控制。
- 自托管文件必须与页面引用的固定版本一致(6.5.2,引用中的
?v=6.5.2即文档替换标签里的版本标记)。设计文档说明 HarvestView 使用固定版本的 Tabulator 构建(DESIGN.md);升级 theHarvester 后如果固定版本变化,需要按新版文档重新核对文件与 SRI 后再更新引用。 - 本次改动只替换两个静态资源的来源,不改变 HarvestView 的接口与鉴权:每个
/api/v1/*路由仍然要求THEHARVESTER_API_KEY(REST API 文档)。
参考
- 安装文档 · Self-host Tabulator
- REST API 文档
- 页面模板 index.html
- 页面模板 schedules.html
- 静态挂载与模板渲染
- 默认状态测试
- e2e 测试中的表格渲染断言
【免费下载链接】theHarvesterE-mails, subdomains and names Harvester - OSINT项目地址: https://gitcode.com/GitHub_Trending/th/theHarvester
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考