Vue.js3超初心者向け。v-htmlが何かと危険性を簡単なサンプルコードで解説 

Vue.js3超初心者向け。v-htmlが何かと危険性を簡単なサンプルコードで解説 

7 回閲覧されました

みなさんこんにちは、jonioです。

今回はVue.js3のv-htmlが何かと危険性について簡単なサンプルコードで解説します。

Laravelの無料学習サイトを作りました

Laravelを勉強したい人向けの無料の学習サイトを作りました。

ここからリンクに飛べますのでぜひ利用してください。

v-htmlとは

HTMLをテンプレートに埋め込むことができます。

下記のサンプルコードで解説します。

<template>
  <div>
    <h2>v-htmlのサンプル</h2>
    <div v-html="htmlContent"></div>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const htmlContent = ref('<p style="color: red;"><strong>こんにちは、Vue 3!</strong></p>');
</script>

4行目の「htmlContent」に11行目のrefの中身が埋め込まれます。

cssを使ったHTMLを埋め込むことができるのでcssを適用させた内容を埋め込みたい時に便利です。

HTMLを埋め込むことができるのでリスクもあります。

危険性

xssの危険性があります。

xssとはscriptタグを使って不正な操作をすることです。

scriptタグはv-htmlが防ぎますがscriptタグの中に入っているDOM操作は防がないのでxssの危険性があります。

下記のサンプルコードで解説します。

<template>
  <div v-html="htmlContent"></div>
</template>

<script setup>
import { ref } from 'vue';

const htmlContent = ref(`<script><a href="javascript:alert('攻撃')">クリックしてね</a></script>`);
</script>

aタグをクリックするとalertが表示されますがこの部分を攻撃するコードに変えるとxssが成立します。

防ぐ方法

例えばDompurifyを使います。

下記のコマンドを叩きます。

npm install dompurify

そして下記の記述をします。

<template>
  <div v-html="sanitizedHtml"></div>        //この行を修正
</template>

<script setup>
import { ref } from 'vue';
import DOMPurify from 'dompurify';     //この行を追記

const htmlContent = ref(`<script><a href="javascript:alert('攻撃')">クリックしてね</a>
const sanitizedHtml = ref(DOMPurify.sanitize(htmlContent));     //この行を追記
</script>`);
</script>

これでxssを防ぐことができます。