Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Reactのエスケープ処理を検証する
Search
そうすけ
August 17, 2025
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Reactのエスケープ処理を検証する
中央線デベロッパー20250816
なぜモダンフロントエンドは安全と言われるのか
そうすけ
August 17, 2025
Featured
See All Featured
ラッコキーワード サービス紹介資料
rakko
1
5.3M
It's Worth the Effort
3n
188
29k
Product Roadmaps are Hard
iamctodd
55
13k
WCS-LA-2024
lcolladotor
0
890
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
360
For a Future-Friendly Web
brad_frost
184
10k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
600
Discover your Explorer Soul
emna__ayadi
2
1.3k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
Statistics for Hackers
jakevdp
799
230k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
550
Transcript
Reactのエスケープ処理を 検証 なぜモダンフロントエンドは安全と言われるのか
自己紹介 名前:そうすけ 会社:株式会社Nint 領域:フロント、バック(TS) 趣味:ヘビ、イベント参加
はじめに 背景 フロントエンド開発の初心者向けのセキュリティ本を読んでみた。 セキュリティの基本 • XSSにはエスケープ処理が必須 • ライブラリやフレームワークを使う方が賢明 • ブラウザの機能も活用する
ReactやVueなどのモダンフレームワークは安全なデフォルトを備え、 開発者が特別意識しなくても一定の防御が効くと言われています。 リティの検証で、いまの XSSでlocalhost8080にあるスクリ プトを実行できるようにするにはどうすれば
本当? 今回はその仕組みを、Reactを題材にXSSの検証してみようとおもいます!セキュリティの検証で、い まのXSSでlocalhost8080にあるスクリプトを実行できるようにするにはどうすれば。
XSSとは? 「悪意あるスクリプトを他人のブラウザで実行させてしまう脆弱性」 モダンフレームワークは意識しなくても防いでくれる
旧来のDOM操作との違い 従来の方法(危険) <div id=app> 入力内容を表示します</div> const app = document.getElementById('app'); const
userInput = '<img src=x onerror="alert(\'👿悪意のあるスクリプト👿!\')">'; app.innerHTML = userInput; // HTMLパーサが動き、スクリプト実行の危険 少し前のフロントエンド開発では、 `innerHTML` を使い、HTML文字列を直接 DOMに挿入することが一般的でした。 <img src="x" onerror="alert('👿悪意のあるスクリプト👿!')" /> タグを勘違いしないようにする書き方で置き換える エスケープ処理 をいれる必要があった。 (< → <) 開発者がエスケープ処理を忘れれば、悪意のあるスクリプトが実装されるリスク大。
Reactのデフォルト挙動 実際に簡単なフォームを作って検証してみました。フォームに入力した値を表示するシンプルなアプリです。 const userInput = '<img src="x" onerror="alert('XSS via img')"
/>'; <div>{userInput}</div> ReactではJSX内で値を埋め込むと、、、
安全な表示の検証結果 ログイン処理結果という部分を見ると、""ようこそ、<img src="x" onerror="alert('XSS via img')" />さん!""となり、 imgタグが文字列として解釈されていることがわかります。 Reactの安全性 •
HTMLタグがそのまま文字列として表示される • スクリプトが実行されない • 自動的にエスケープ処理が行われる
危険な表示 dangerouslySetInnerHTML ReactにもHTMLを直接挿入する手段は存在します。 それがdangerouslySetInnerHTMLです。 これを使うと、意図しないスクリプトが実行されます。 結果、スクリプトが実行されました。名前の通り「危険な」APIです。 <div dangerouslySetInnerHTML={{ __html: userInput
}} />
エスケープ処理の仕組みの深堀り React自身が「エスケープ処理」をしているのではなく、常に安全な DOM API(createTextNode)を使っているので、結果的にエスケー プされているということです。 Reactが「エスケープしている」と言われる理由は、値を HTML文字列として扱わず、テキストノードとして DOMに追加しているからです。 デフォルト 危険
SSRでは自前でエスケープ処理してる SSR(サーバーサイドレンダリング)環境では、 createTextNodeのようなブラウザの機能が存在しないので使えません。 DOM生成される前の素のHTMLを確認すると、、 ・通常のReact要素→文字列にエスケープ処理されてる ・innerHTML→そのままimgタグとして解釈されている
Vueの場合も同様 安全なデフォルト Vueもデフォルトでは値をHTMLとして解釈せず、テキストノード としてDOMに追加するため、自動的にエスケープされます。 危険なAPI Vueには v-html ディレクティブがあり、これを使うとHTMLとして 挿入されます。XSSのリスクが復活するので注意が必要です。 つまり、VueもReactと同じく「安全なデフォルト」ですが、意図的に機能を使えば危険になる点は共通しています。
まとめ 安全なデフォルト モダンフロントエンドは、値を直接HTMLとして解釈させず、 古典的なXSSの多くを未然に防いでくれます。 仕組みの理解 なぜ安全なのかを知っておくと、ライブラリ選定の1つの材料になる。 「安全なデフォルト」を信じるのは大事ですが、 なぜ安全なのかを知っておくと、いざというとき安心してコードを書けますね☺ 開発者がやること InnerHtmlを使わない。JSの読み込み許可設定(CSPなど)、