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)
正如另一个答案中所述,您可以禁用警告,但一个好的做法是确保正确禁用该规则。
为此,您可以使用dompurify来解析您提供给浏览器的 HTML,删除任何恶意部分并安全地显示它。
问题仍然存在,但你可以使用RisXSS ,它是一个 ESLint 插件,v-html 如果你之前没有清理它,它会警告用户(从某种意义上说,这是vue/no-v-htmlESLint 规则的改进版本)。
为此,请安装dompurify并eslint-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 插件的贡献者。
根据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 自定义指令