Vuejs:根据 eslint 规则对 html 数据进行 V-HTML 数据绑定

Cha*_*Hon 14 html javascript data-binding eslint vue.js

我正在使用以下方法绑定 html 并显示在我的页面中。它工作完美,但是我收到来自 eslint 的警告,“v-html”指令可能导致 XSS 攻击。eslint(vue/no-v-html)

  <button
        id="foreignerBtn"
        class="tabButton"
        @click="foreignerClick"
        v-html="textContent2"
      ></button>
Run Code Online (Sandbox Code Playgroud)

然后我按照以下方法更改它。但我无法渲染 html 标签。

 <button
            id="foreignerBtn"
            class="tabButton"
            @click="foreignerClick"
          >{{ textContent2 }}</button>
Run Code Online (Sandbox Code Playgroud)

Bir*_*chl 38

正如 Decade Moon 提到的,如果传递给 v-html 的内容是经过净化的 HTML,则可以禁用该规则。

https://eslint.vuejs.org/rules/no-v-html.html

通过将 html 包裹起来来禁用该规则

<!-- eslint-disable vue/no-v-html -->
<button
        id="foreignerBtn"
        class="tabButton"
        @click="foreignerClick"
        v-html="textContent2"
      ></button>
<!--eslint-enable-->
Run Code Online (Sandbox Code Playgroud)

  • 如果您只想禁用下一行,只需添加:`&lt;!-- eslint-disable-next-line vue/no-v-html --&gt;` (13认同)

cle*_*ano 9

正如另一个答案中所述,您可以禁用警告,但一个好的做法是确保正确禁用该规则。

为此,您可以使用dompurify来解析您提供给浏览器的 HTML,删除任何恶意部分并安全地显示它。

问题仍然存在,但你可以使用RisXSS ,它是一个 ESLint 插件,v-html 如果你之前没有清理它,它会警告用户(从某种意义上说,这是vue/no-v-htmlESLint 规则的改进版本)。

为此,请安装dompurifyeslint-plugin-risxss

npm install dompurify eslint-plugin-risxss
Run Code Online (Sandbox Code Playgroud)

添加risxss到您的 ESLint 插件,然后使用 DOMPurify:

npm install dompurify eslint-plugin-risxss
Run Code Online (Sandbox Code Playgroud)

免责声明:我是 RisXSS 插件的贡献者。


xor*_*xor 5

根据clementescolano 的回答,我使用自定义指令提出了以下解决方案:

在你的main.js(或者你定义 vue 实例的任何地方),添加:

import DOMPurify from "dompurify";

// ...

Vue.directive("sane-html", (el, binding) => {
  el.innerHTML = DOMPurify.sanitize(binding.value);
});
Run Code Online (Sandbox Code Playgroud)

现在,无论您在何处使用该指令v-html,请v-sane-html改为使用。

注意,请参阅此处了解 vue2 自定义指令