跳转到内容

安全性 ​

Pivotick 完全在浏览器中运行:没有服务器,没有会话,也没有自己的持久性。重要的边界是图形数据和页面的DOM之间的边界——Pivotick将您传递到应用程序拥有的文档中的数据呈现出来。

如果该数据来自您无法完全控制的地方(威胁情报源、CVE 镜像、导入的数据集、其他用户的上传),请将其视为不可信,并阅读本页的其余部分。

Pivotick保证什么 ​

库从您的数据呈现的所有内容都以 text 的形式插入,而不是标记。其中涵盖节点和边缘标签、描述、ID、属性键和值以及注释内容:

  • 标签、描述和属性名称/值均用 textContent 书写。
  • 注意内容是 Markdown,使用 marked 渲染,然后使用 DOMPurify 根据 Markdown 本身生成的标签允许列表进行清理。 <style>,表单元素和内联style属性不在上面。
  • style.svgIcon标记在到达文档之前已被清理(SVG配置文件),因此事件处理程序<script>和<foreignObject>被剥离,<style>和<a>也是如此。内联 <style> 的范围不限于图标,而 <a> 会将选择节点转变为导航。保留下来的属性是 DOMPurify 的 SVG 允许列表加上 dominant-baseline 和 alignment-baseline,因此文本可以像 Pivotick 居中其自己的字形一样居中。 <use> 被彻底删除,因此内联精灵符号而不是引用它们。
  • style.imagePath 仅限于http:、https:、data: 和blob: 方案。
  • 数据中的颜色(节点的 style.color 和注释的 color)在到达文档之前必须解析为 CSS 颜色,因此它们无法将 url() 偷运到 background 中。
  • 呈现为链接的属性值带有 rel="noopener noreferrer",并且任何离开原点(包括 //host/path)的属性值都会在新选项卡中打开,而不是替换您的原点。

因此,string 始终呈现为文本。 无论选项接受 string | HTMLElement,返回字符串都会获取文本;要渲染您自己的 HTML,请构建并返回一个 HTMLElement:

ts
// Renders the literal characters "<b>hi</b>"
propertiesPanel: { render: () => '<b>hi</b>' }

// Renders bold text
propertiesPanel: { render: () => {
    const el = document.createElement('b')
    el.textContent = 'hi'
    return el
} }

1.4.0 / 1.5.0 更改

早期版本将此类字符串解析为 HTML — 1.3.0 及更早版本中的属性值,以及 1.4.0 之前的所有其他 string | HTMLElement 选项(额外面板、上下文菜单条目、自定义渲染器)。如果您依赖它来注入标记,请切换到返回元素。

可信-HTML沉没 ​

存在一些专门的选项,以便您可以提供自己的标记。 Pivotick 插入你给它的内容 逐字,所以永远不要从不受信任的数据构建这些:

选项哪里
rawHeader / rawBodyModal 和 SlidePanel 选项
render.defaultNodeStyle.html在 <foreignObject> 中绘制的节点内容

如果您需要其中之一的数据,请将其与 textContent 放在您创建的元素上,而不是将其插入标记字符串中:

ts
// Unsafe: node.data.label lands in innerHTML
uiManager.createModal({ rawBody: true, body: `<h1>${node.getData().label}</h1>` })

// Safe
const title = document.createElement('h1')
title.textContent = node.getData().label
uiManager.createModal({ body: title })

出站请求 ​

节点可以通过style.imagePath或style.svgIcon内的<image href>引用图片。呈现这样的节点会使用户的浏览器获取该 URL。如果 URL 来自不受信任的数据,那么编写该 URL 的人就会知道该图表已被查看,以及查看者的 IP 地址、时间和 User-Agent — 跟踪像素。

方案限制无法阻止这种情况,因为必须允许 https: 才能使该功能正常工作。如果您的数据不受信任并且这对您很重要,请在移交数据之前剥离/重写图像引用,或者使用内容安全策略来约束它们。

Pivotick不需要eval,也不需要内联<script>,因此它在严格的策略下工作。 CSP 是钝化任何注入的最便宜的方法 - 在库中、在您自己的代码中或在其他依赖项中:

Content-Security-Policy:
    default-src 'self';
    script-src 'self';
    img-src 'self' data: blob: https://images.example.com;
    style-src 'self' 'unsafe-inline';
    form-action 'self';
  • 没有 'unsafe-inline' 的 script-src 可以中和注入的事件处理程序。
  • img-src 是您确定哪些主机节点图片可能来自的地方。
  • form-action 限制任何注入表单可以发布的位置,无论其 action 说什么。
  • 当前需要 style-src 'unsafe-inline':渲染器设置内联样式,Pivotick 的样式表通常由捆绑程序注入。将 CSS 作为文件提供,如果需要删除它,请使用随机数或哈希值。

报告漏洞 ​

请通过GitHub安全公告而不是公共问题报告可疑漏洞。