Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
React and XSS
Search
Yunosuke Yamada
October 16, 2022
Programming
0
240
React and XSS
Yunosuke Yamada
October 16, 2022
Tweet
Share
More Decks by Yunosuke Yamada
See All by Yunosuke Yamada
ChatGPTのアルゴリズム
yunosukey
0
340
DB Tree Algorithms
yunosukey
0
86
Tests in Go
yunosukey
1
100
Bugless Code
yunosukey
0
110
圏論とコンピュータサイエンス / Category Theory and Theoretical Computer Science
yunosukey
0
220
Other Decks in Programming
See All in Programming
PHPを書く理由、PHPを書いていて良い理由 / Reasons to write PHP and why it is good to write PHP
seike460
PRO
5
460
pytest プラグインを開発して DRY に自動テストを書こう
inuatsu
2
260
学生の時に開催したPerl入学式をきっかけにエンジニアが組織に馴染むために勉強会を主催や仲間と参加して職能間の境界を越えていく
ohmori_yusuke
1
130
Cohesion in Modeling and Design
mploed
3
200
Vue :: Better Testing 2024
up1
1
400
RDBの世界をぬりかえていくモデルグラフDB〜truncus graphによるモデルファースト開発〜
jurabi
0
170
ACES Meet におけるリリース作業改善の取り組み
fukucheee
0
130
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
200
.NET Aspireのクラウド対応検証: Azureと他環境での実践
ymd65536
1
420
ポケモンで考えるコミュニケーション / Communication Lessons from Pokémon
mackey0225
4
170
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
0
170
Интеграционное тестирование: как приручить хаос
lamodatech
0
560
Featured
See All Featured
Designing on Purpose - Digital PM Summit 2013
jponch
114
6.9k
Infographics Made Easy
chrislema
239
18k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
The Brand Is Dead. Long Live the Brand.
mthomps
53
38k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
249
21k
The Invisible Customer
myddelton
119
13k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Gamification - CAS2011
davidbonilla
80
5k
Building an army of robots
kneath
302
42k
The Pragmatic Product Professional
lauravandoore
31
6.2k
The Cult of Friendly URLs
andyhume
77
6k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
231
17k
Transcript
ReactとXSS 2021/07/15 山田悠之介
XSS (Cross-site scripting) 悪意のあるスクリプトを閲覧者のブラウザで実行すること 反射型 XSS、格納型 XSS、DOM Based XSS などの種類があるが
いずれも XSS するためには文字列として入力したスクリプトを 標的となるサイトで実行させなければならない 2
React React では XSS 対策として文字列はエスケープされる。 https://ja.reactjs.org/docs/jsx-in-depth.html#string-literals 3
生成される HTML export default function Home() { const script =
` <script> while (1) { alert('!'); } </script>`; return <main>{script}</main>; } ↓ <main><script> while (1) { alert('!'); } </script></main> 4
innerHTML 標準の JS や jQuery で HTML を動的に生成するときには innerHTML を使っていた。
React では... 5
dangerouslySetInnerHTML https://ja.reactjs.org/docs/dom- elements.html#dangerouslysetinnerhtml export default function Home() { const script
= ... const html = { __html: script }; return ( <main> <div dangerouslySetInnerHTML={html} />; </main> ); } 6
href, src export default function Home() { const script =
` javascript: while (1) { alert('!'); }`; return ( <main> <a href={script}>link</a> </main> ); } 7
"javascript:"は deprecated https://reactjs.org/blog/2019/08/08/react- v16.9.0.html#deprecating-javascript-urls 将来的にはエラーにする 8
その他 DOM 要素の取得 (findDOMNode, createRef) からの innerHTML createElement SSR +
Redux eval(React 関係ないけど) 9
回避するには ユーザの入力を無害化する DOMPurify 10
import DOMPurify from "isomorphic-dompurify"; export default function Home() { const
script = "<script>...</script>Hello"; const html = { __html: DOMPurify.sanitize(script) }; return ( <main> <div dangerouslySetInnerHTML={html} /> </main> ); } ↓ <main><div>Hello</div></main> 11
参考資料 https://zenn.dev/yuuhu04/books/xss-anti-pattern-of-react- and-vue 最初に読んだ https://pragmaticwebsecurity.com/articles/spasecurity/react -xss-part1.html part3 まである 網羅的 12
Thank you 13