说明

把文本当做HTML代码渲染。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <div id="app"></div>
  11. <template id="my-app">
  12. <div>{{msg}}</div>
  13. <div v-html="msg"></div>
  14. </template>
  15. <script src="https://unpkg.com/vue@next"></script>
  16. <script>
  17. const App = {
  18. template: '#my-app',
  19. data() {
  20. return {
  21. msg: '<span style="color:red; background: blue;">哈哈哈</span>'
  22. }
  23. }
  24. }
  25. Vue.createApp(App).mount('#app');
  26. </script>
  27. </body>
  28. </html>

image.png

安全隐患

注意!你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。

image.png
如上图,虽然vue不允许你直接写script标签,但是可以通过其他方式执行

下面代码,放在服务器环境下运行

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <div id="app"></div>
  11. <template id="my-app">
  12. <div>{{msg}}</div>
  13. <div v-html="msg"></div>
  14. <div v-html="hack"></div>
  15. </template>
  16. <script src="https://unpkg.com/vue@next"></script>
  17. <script>
  18. // 设置cookie,用来测试
  19. document.cookie = "name=test";
  20. const App = {
  21. template: '#my-app',
  22. data() {
  23. return {
  24. msg: '<span style="color:red; background: blue;">哈哈哈</span>',
  25. hack: '<img src="123123" alt="" onerror="console.log(document.cookie)">',// 通过输入不存在的img src,让其执行onerror里面的恶意代码
  26. }
  27. }
  28. }
  29. Vue.createApp(App).mount('#app');
  30. </script>
  31. </body>
  32. </html>

如下图,通过输入不存在的img src,让其执行onerror里面的恶意代码。
image.png

如果服务器保存了用户输入的恶意代码,然后通过v-html 生成标签,就会执行代码,产生安全隐患