diff --git "a/source/_posts/2025/20251016a_Vue.js\351\200\243\350\274\211_2025_\343\202\222\345\247\213\343\202\201\343\201\276\343\201\231.md" "b/source/_posts/2025/20251016a_Vue.js\351\200\243\350\274\211_2025_\343\202\222\345\247\213\343\202\201\343\201\276\343\201\231.md" index d1c40510ac5..72d99804341 100644 --- "a/source/_posts/2025/20251016a_Vue.js\351\200\243\350\274\211_2025_\343\202\222\345\247\213\343\202\201\343\201\276\343\201\231.md" +++ "b/source/_posts/2025/20251016a_Vue.js\351\200\243\350\274\211_2025_\343\202\222\345\247\213\343\202\201\343\201\276\343\201\231.md" @@ -26,7 +26,7 @@ lede: "Vue.jsの魅力と可能性をさらに深く探るべく、フューチ | 10/22(水) | 山本 竜玄 | [Vueでモバイルアプリ開発](/articles/20251022a/) | | 10/23(木) | 澁川 喜規 | [Vueのフロントエンドをセキュリティのしっかりしたコンテナにする](/articles/20251023a/) | | 10/24(金) | 松本 朝香 | 初心者がSPA(Single Page Application)を実装してみた | -| 10/27(月) | 永井 優斗 | 脆弱なアプリを作って&使って学ぶ、Vue.jsのセキュリティ観点で気をつけたいポイント | +| 10/27(月) | 永井 優斗 | [脆弱なアプリを作って&使って学ぶ、Vue.jsのセキュリティ観点で気をつけたいポイント](/articles/20251027a/) | [Vue Fes Japan 2025](https://vuefes.jp/2025/)も10/25と開催間近、[フューチャーもゴールドスポンサー](https://vuefes.jp/2025/sponsors/future)として協賛しております。一緒に盛り上げていきましょう。 diff --git "a/source/_posts/2025/20251027a_Vue.js\343\201\247\350\204\206\345\274\261\343\201\252\343\202\242\343\203\227\343\203\252\343\202\222\344\275\234\343\201\243\343\201\246\345\255\246\343\201\266\343\200\201\343\202\273\343\202\255\343\203\245\343\203\252\343\203\206\343\202\243\351\235\242\343\201\247\346\260\227\343\202\222\343\201\244\343\201\221\343\201\237\343\201\204\343\203\235\343\202\244\343\203\263\343\203\210.md" "b/source/_posts/2025/20251027a_Vue.js\343\201\247\350\204\206\345\274\261\343\201\252\343\202\242\343\203\227\343\203\252\343\202\222\344\275\234\343\201\243\343\201\246\345\255\246\343\201\266\343\200\201\343\202\273\343\202\255\343\203\245\343\203\252\343\203\206\343\202\243\351\235\242\343\201\247\346\260\227\343\202\222\343\201\244\343\201\221\343\201\237\343\201\204\343\203\235\343\202\244\343\203\263\343\203\210.md" new file mode 100644 index 00000000000..59299541784 --- /dev/null +++ "b/source/_posts/2025/20251027a_Vue.js\343\201\247\350\204\206\345\274\261\343\201\252\343\202\242\343\203\227\343\203\252\343\202\222\344\275\234\343\201\243\343\201\246\345\255\246\343\201\266\343\200\201\343\202\273\343\202\255\343\203\245\343\203\252\343\203\206\343\202\243\351\235\242\343\201\247\346\260\227\343\202\222\343\201\244\343\201\221\343\201\237\343\201\204\343\203\235\343\202\244\343\203\263\343\203\210.md" @@ -0,0 +1,254 @@ +--- +title: "Vue.jsで脆弱なアプリを作って学ぶ、セキュリティ面で気をつけたいポイント" +date: 2025/10/27 00:00:00 +postid: a +tag: + - Vue.js + - 脆弱性 +category: + - Frontend +thumbnail: /images/2025/20251027a/thumbnail.png +author: 永井優斗 +lede: "Vue.jsで実際にわざと脆弱なアプリを作り、そこからXSS・Cookie・CSRF・レート制限といった脆弱性を一気に体験してみます。" +--- +image.png + +※上記サムネイルはChatGPTにて本記事を読み込ませて生成しました。 + +Future Value Group(FVG)の永井優斗です。 + +[Vue.js連載](/articles/20251016a/)の8本目です。Vue.js は使いやすく、直感的なテンプレート構文でフロントエンド開発を加速してくれます。しかし、その便利さゆえに「セキュリティをうっかり見落とす」ことがあるのも事実です。 + +この記事では、Vue.jsで実際に**わざと脆弱な**アプリを作り、そこからXSS・Cookie・CSRF・レート制限といった脆弱性を一気に体験してみます。ちなみにソースの8割ぐらいは生成AIに生成してもらいました。この記事も生成AIと相談しながら書きました。すごいね。 + +教材アプリは[こちらのGitHub](https://github.com/yut0naga1/vue-ctfs)上で公開しています。 + +※試すことを優先しているのでUIはシンプルに。そのうちきれいにしたいなあ… + +# はじめに + +今回の教材アプリは Vue 3 + Vite で構築し、バックエンドには Express を利用します。 + +「脆弱版」と「安全版」を切り替えて、落とし穴と対策を比較できる構成です。 + +```sh +01-vulnerable/ # ← わざと脆弱な実装 +02-safe/ # ← 対策を施した実装 +``` + +ローカルで起動してお試しください。 + +教材アプリはセキュリティの知識を駆使して情報を抜き取るゲームである、「CTF(Capture The Flag)」のような形で作成しており、脆弱版では各課題にて「攻撃」が成功すると100点のスコアがGetできます。全部で3問あります。 + +この記事はCTFの「答え」にあたるものでもあるので、セキュリティ知識を試したい方は先に教材アプリを試してみてから本記事をお読みください。 + +::: note warn +**警告** +意図的に脆弱性をふくめているアプリケーションですので、公開環境やインターネットに接続された環境で実行しないでください。学習用にローカルで閉じた環境でのみ利用してください。 + +また、本記事や教材アプリは代表的な脆弱性の学習のための資料であり、攻撃を目的としたものではございません。 +::: + +起動方法: + +```bash +cd 01-vulnerable +npm install +npm run server # APIサーバ (http://localhost:3001) +npm run dev # フロントエンド (http://localhost:5173) 上のnpm run serverとは別のターミナルで実行してください +``` + +# 1. DOM XSS(v-htmlの乱用) + +Vue.js では、テンプレートの中で変数を埋め込む際、`{{ userInput }} `のように記述すると、自動的にHTMLがエスケープされます。 +そのため、通常の使い方ではユーザーの入力からXSSは発生しません。 + +しかし、「HTMLを直接描画したい」という欲求に負けて v-html を使うと、XSSの標的になるかもしれません。 + +## v-htmlとは + +```html +
+``` + +このように書くと、someHtml の中身がそのままHTMLとして挿入されます。 + +つまり、ユーザー入力が `

こんにちは

` なら、実際に `

` タグが生成されます。そしてユーザー入力が `` だったら……?そのままスクリプトが実行されます。 + +## 実際にXSSを起こしてみよう + +教材アプリでは「脆弱UI(XSS)」という課題ページがあります。 + +手順: + +- テキストエリアに以下を入力してください。 + +```html + +``` + +- 下のプレビュー領域が v-html で描画されています。 + +そこに画像タグが挿入され、onerror 属性が評価されるとアラートが表示されます。ここで表示される `window.__FLAG_XSS` は教材用のフラグでグローバルな秘密変数を想定しています。実運用ならこのような「グローバルな秘密変数」は致命的です。 + +#### 攻撃を試してみて何も起きないときは以下を確認してみてください。 + +- `