安全性
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:
// 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 / rawBody | Modal 和 SlidePanel 选项 |
render.defaultNodeStyle.html | 在 <foreignObject> 中绘制的节点内容 |
如果您需要其中之一的数据,请将其与 textContent 放在您创建的元素上,而不是将其插入标记字符串中:
// 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安全公告而不是公共问题报告可疑漏洞。