news 2026/9/15 21:06:11

如何为 theHarvester HarvestView 自托管 Tabulator 静态资源以支持隔离网络

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何为 theHarvester HarvestView 自托管 Tabulator 静态资源以支持隔离网络

如何为 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 行)。三个位置都带integritycrossoriginreferrerpolicy属性。
  • 静态资源由服务从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 值原样来自安装文档的表格):

FileCDNjs sourceSRI
tabulator.min.csshttps://cdnjs.cloudflare.com/ajax/libs/tabulator-tables/6.5.2/css/tabulator.min.csssha512-t8I/asqzdu/MRgVLxVanQ/c5bhUA1qZ/zA432a/3nUh0kkd7P8Qch35wQvTODivf9D6Xv3h7F8p7ezcUyBOQrQ==
tabulator.min.jshttps://cdnjs.cloudflare.com/ajax/libs/tabulator-tables/6.5.2/js/tabulator.min.jssha512-AF0YMSgc0Ui4IJPb4hJNSi16wFidZEQa6ZTCAeguF3h5glVnAPuz/JT2ai9ypKhsc9n6CEXBB+tMdxsv1q+rxg==

表中 SRI 值就是页面原始标签上integrity属性使用的值,可以用来核对下载产物与固定版本一致。

在联网环境下载并放入静态目录

在能访问公网的机器上下载这两个文件。使用curl -fO时保存的文件名就是 URL 末段,即tabulator.min.csstabulator.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>

同时从这两个本地标签上去掉integritycrossoriginreferrerpolicy属性——文档说明它们只用于 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:5000THEHARVESTER_API_KEY需要替换为一个长随机值。

验证结果

  1. 页面不再引用 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
  1. 同源资源可访问:请求http://127.0.0.1:5000/static/harvestview/tabulator.min.js(以及.css)应返回文件内容。默认状态下这两个路径是 404(仓库测试已核实),返回 200 说明静态挂载已找到你放入的文件。
  2. 浏览器打开 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 21:04:57

CPython如何将SIGPIPE信号转为BrokenPipeError异常

1. 这不是你的代码错了&#xff0c;是 CPython 在“悄悄关窗”你写了个简单的管道操作&#xff1a;echo "hello" | python3 -c "import sys; print(sys.stdin.read().strip().upper())"&#xff0c;一切正常&#xff1b;但换成head -n1 | python3 -c "…

作者头像 李华
网站建设 2026/9/15 21:04:51

Python实现LAS点云到3D Tiles的工程化转换

简介&#xff1a;本资源是一个基于Python实现的LAS点云数据批量转换为3DTiles格式的高分毕业设计项目&#xff0c;面向地理信息、遥感测绘、三维可视化方向的本科生与研究生&#xff0c;解决点云数据在Cesium等WebGIS平台中高效加载与渲染的核心问题。压缩包共66个文件&#xf…

作者头像 李华
网站建设 2026/9/15 21:04:08

HFSS、CST、ADS选型本质:设计阶段决定仿真工具

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 21:03:45

HyperFrames WAAPI与Anime.js适配完全指南:Seek帧的5个要点

HyperFrames WAAPI与Anime.js适配完全指南&#xff1a;Seek帧的5个要点 【免费下载链接】hyperframes Write HTML. Render video. Built for agents. 项目地址: https://gitcode.com/GitHub_Trending/hy/hyperframes HyperFrames&#xff08;HyperFrames&#xff09;是一…

作者头像 李华
网站建设 2026/9/15 21:02:51

CentOS 8静默安装Oracle 11.2.0.1实战:兼容性排错全记录

CentOS 8 装 Oracle 11.2.0.1&#xff0c;这个组合放在几年前我连想都不敢想。一个是 2019 年才发布的新系统&#xff0c;一个是 2007 年就停止开发的数据库老将&#xff0c;官方认证矩阵里 11gR2 最高只到 RHEL 6&#xff0c;按道理这俩根本不该见面。但现实很骨感。我接手过一…

作者头像 李华