说明
把文本当做HTML代码渲染。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<template id="my-app">
<div>{{msg}}</div>
<div v-html="msg"></div>
</template>
<script src="https://unpkg.com/vue@next"></script>
<script>
const App = {
template: '#my-app',
data() {
return {
msg: '<span style="color:red; background: blue;">哈哈哈</span>'
}
}
}
Vue.createApp(App).mount('#app');
</script>
</body>
</html>
安全隐患
注意!你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。
如上图,虽然vue不允许你直接写script标签,但是可以通过其他方式执行
下面代码,放在服务器环境下运行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app"></div>
<template id="my-app">
<div>{{msg}}</div>
<div v-html="msg"></div>
<div v-html="hack"></div>
</template>
<script src="https://unpkg.com/vue@next"></script>
<script>
// 设置cookie,用来测试
document.cookie = "name=test";
const App = {
template: '#my-app',
data() {
return {
msg: '<span style="color:red; background: blue;">哈哈哈</span>',
hack: '<img src="123123" alt="" onerror="console.log(document.cookie)">',// 通过输入不存在的img src,让其执行onerror里面的恶意代码
}
}
}
Vue.createApp(App).mount('#app');
</script>
</body>
</html>
如下图,通过输入不存在的img src,让其执行onerror里面的恶意代码。
如果服务器保存了用户输入的恶意代码,然后通过v-html 生成标签,就会执行代码,产生安全隐患