在VUE中 {{{ data }}}和v-html属性会把内容解析成html,可能会造成xss漏洞;
以及 当使用SSR( Server Side Rendering(服务端渲染)), SSR 的时候忘记了转义和过滤而导致XSS;
vue使用csp时,需要使用csp兼容版本
$ npm install vue # 获取CSP兼容版本: $ npm install vue@csp
demo:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content=" img-src https://*; script-src * 'unsafe-inline' 'nonce-1'; ">
<script src="vue.min.js"></script>
</head>
<body>
<div id="app">
{{ message }}
</div>
<div id="test"></div>
<div id="test2"></div>
<script nonce=1>
new Vue({
el:'#app',
data: {
message:'Hello World!'
}
});
</script>
<script type="text/javascript" nonce=1>
document.getElementById('test').innerHTML = 'xxx';
</script>
<script type="text/javascript" nonce=2>
document.getElementById('test2').innerHTML = 'sss';
</script>
</body>
</html>
vue组件成功执行,nonce=1的成功执行而nonce=2的js没有执行,所以CSP策略成功执行。
VUE官方文档里的兼容CSP方法:
当使用运行时只有建立WebPACK + Vue装载机或Browserify + vueify,将预编译渲染模板,能工作在CSP环境。
这里使用webpack +vue尝试,用npm 搭建vue的官方demo,vue init webpack my-first-vue-project.
改写 index ,加入meta
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content=" script-src * 'unsafe-inline' ; ">
<title>myvue</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
npm run dev ,浏览器console发现报错
按提示,meta加入'unsafe-eval'后成功运行:
不过无法指定nonce,因此VUE用webpack时要限制script-src的域名才有安全的CSP的策略。
总结:
vue ,react都对基本数据进行了转义,同时,许多基于MVVM
框架的单页面应用不需要刷新URL来控制view。但代码疏忽还是有xss可能性,所以使用CSP策略可以双重保险,避免人为的疏忽导致XSS漏洞。