提问人:Niek Jonkman 提问时间:3/20/2019 更新时间:2/11/2023 访问量:20173
默认情况下,Vue 是否为 XSS 提供安全保护或防御?
Does Vue, by default, provide security for or protects against XSS?
问:
我试图弄清楚如何保护,
- 角
- Vue的
- 反应
对抗 XSS 攻击。当我访问 Angular 官方文档时,
https://angular.io/guide/security
,它说:
为了系统地阻止 XSS 错误,Angular 将所有值视为 默认情况下不受信任。当一个值从 模板,通过属性、特性、样式、类绑定或 插值,Angular 清理并转义不受信任的值。
以及:
Angular 清理 HTML、样式和 URL 的不受信任的值; 无法清理资源 URL,因为它们包含任意 法典。在开发模式下,Angular 在以下情况下会打印控制台警告 必须在清理过程中更改值。
和:
Angular 将该值识别为不安全并自动对其进行清理, 这会删除标签,但会保留安全内容,例如 元素。
当我转到 React 官方文档时,
https://reactjs.org/docs/introducing-jsx.html#jsx-prevents-injection-attacks
,它说如下:
在 JSX 中嵌入用户输入是安全的:
和:
默认情况下,React DOM 会转义之前嵌入在 JSX 中的任何值 渲染它们。因此,它确保您永远无法注射任何东西 这不会显式写入您的应用程序中。一切都是 在呈现之前转换为字符串。这有助于防止 XSS (跨站点脚本)攻击。
但是对于 Vue,我在他们的文档中找不到任何关于 XSS 保护的内容,或者他们默认可以提供的任何内容。
我的问题:默认情况下,Vue 是否提供任何针对 XSS 攻击的保护方式,或者我需要寻找第三方解决方案?
当我在谷歌上搜索这个主题时,我得到很多博客文章、网站和文章,例如,这个项目来清理我的 HTML:
答:
vue 中没有内置的清理器。根据 Evan You(Vue 的创建者)对问题的评论
内置消毒器会在极少数用例中增加额外的捆绑重量 (当 V-HTML 的大多数用例都用于受信任的内容时);它也是 通过设置 Vue.prototype.$sanitize = 来添加 sanitize-html 很简单 sanitizeHTML,然后执行 v-html=“$sanitize(html)”。
查看这个帖子: https://github.com/vuejs/vue/issues/6333
评论
v-text
比答案更多的附加信息:就像在另一篇文章中提到的一样,确实有一个 327 KB 权重的缺点。但也有更小的软件包可用:sanitize-html
为了在我们的项目中防止 XSS,我们使用了 vue-dompuritfy-html,它有一个好处,可以涵盖推荐的 eslint 规则 vue/no-v-html。安装后,您可以简单地使用
<div v-dompurify-html="htmlContent" />
帮助防范 XSS 的一种方法是在 html 头中添加内容安全策略。它的工作原理是限制页面可以加载的资源(脚本、图像)以及限制页面的框架。
例如,以下指令仅允许从与页面本身相同的源加载脚本,并且“apis.google.com”。
<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://apis.google.com">
还有其他 CSP 设置可用于帮助缓解 XSS 攻击,例如随机数和哈希。欲了解更多信息,请访问:https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
我认为公认的答案具有误导性。清理 HTML 和转义 HTML(也称为 HTML 编码)是有区别的。前者意味着转弯
<img src=x onerror=alert(1)>
自
<img src="x">
而后者意味着将其变成
<img src=x onerror=alert(1)>
只有少数情况下需要 HTML 清理。一种情况是,当用户需要使用富文本格式编写消息时,因此您允许用户编写带有一些列入白名单的标记(如 和 )的 HTML。i
b
img
但在 99% 的情况下,您只想让文本成为文本。所以当你写
<h1>{{ userProvidedString }}</h1>
用户输入
<img src=x onerror=alert(1)>
您希望页面从字面上显示。大多数现代框架,如 Vue、Angular 和 React 都是通过自动 HTML 编码输出来实现的。所以是的,Vue 默认会防御 XSS。<img src=x onerror=alert(1)>
如果你想让浏览器将输入解释为 HTML,以便页面显示图像和警告框,你可以在 Vue 中使用,这相当于在 Angular 和 React 中。在这种情况下,您应该考虑使用 HTML 清理器。v-html
ng-bind-html
dangerouslySetInnerHTML
评论
v-text
v-html