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
Next.js で始めるセキュリティ入門
Search
Shumpei O.
March 27, 2025
Technology
0
6
Next.js で始めるセキュリティ入門
2025/3/27
エンジニアコミュニティ内での登壇
Shumpei O.
March 27, 2025
Tweet
Share
More Decks by Shumpei O.
See All by Shumpei O.
例外処理について考える
shumpei0111
0
170
Reactで汎用的なinputコンポーネントを考える
shumpei0111
0
78
複数人での 大規模サイト移植のテクニック
shumpei0111
1
890
個人開発者は Jamstackでブログを書こう!〜WordPressもいいけどJamstackもね〜
shumpei0111
0
120
Other Decks in Technology
See All in Technology
Obsidian応用活用術
onikun94
1
480
react-callを使ってダイヤログをいろんなとこで再利用しよう!
shinaps
1
230
COVESA VSSによる車両データモデルの標準化とAWS IoT FleetWiseの活用
osawa
1
270
ガチな登山用デバイスからこんにちは
halka
1
240
250905 大吉祥寺.pm 2025 前夜祭 「プログラミングに出会って20年、『今』が1番楽しい」
msykd
PRO
1
710
20250903_1つのAWSアカウントに複数システムがある環境におけるアクセス制御をABACで実現.pdf
yhana
3
550
共有と分離 - Compose Multiplatform "本番導入" の設計指針
error96num
1
370
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
8.7k
現場で効くClaude Code ─ 最新動向と企業導入
takaakikakei
1
230
テストを軸にした生き残り術
kworkdev
PRO
0
200
「何となくテストする」を卒業するためにプロダクトが動く仕組みを理解しよう
kawabeaver
0
390
バイブスに「型」を!Kent Beckに学ぶ、AI時代のテスト駆動開発
amixedcolor
2
540
Featured
See All Featured
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.6k
The Cult of Friendly URLs
andyhume
79
6.6k
Navigating Team Friction
lara
189
15k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Agile that works and the tools we love
rasmusluckow
330
21k
Building Applications with DynamoDB
mza
96
6.6k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Transcript
Next.jsで始める セキュリティ入門 Shumpei / 2025.3.27
Shumpei フロントエンドエンジニア X: @seventhseven https://x.com/seventhseven 自己紹介
今日のゴール • Webアプリケーションにおけるセキュリティについて知るきっかけに • XSSに対して、Next.jsで実施する対応方法がわかる
おことわり - 今回は自分なりにまとめたことを共有する。 という形で発表します - Webアプリケーションを想定しています
結論 • XSSについて、React(JSX)についてはデフォルトでサポートされている • ただそれだけでは対応できない箇所があるので、 穴を塞ぐ意味でもやれておくことに越したことない
アジェンダ • 代表的なセキュリティリスク • セキュリティリスクへの対策 • 実装例 • まとめ
アジェンダ • 代表的なセキュリティリスク 👈 • セキュリティリスクへの対策 • 実装例 • まとめ
☠🔥 XSS クロスサイト・スクリプティング 悪意あるスクリプトがアプリに埋め込ま れ、 そのスクリプトを読み込んだユーザのブ ラウザ上で実行されてしまう 攻撃 ☝今回はこの話 代表的なセキュリティリスク
☠🔥 CSRF クロスサイト・リクエストフォージェリ 認証済みユーザの権限を悪用する。悪 意あるサイト上に誘導し、その中でスク リプト実行やリンクを踏むことで好き勝 手されてしまう攻撃
☠🔥 認証・セッション管理 ログイン情報(Cookie属性など)・セッ ションID・トークンの期限設定などの管 理不足からくる不正アクセス 代表的なセキュリティリスク ☠🔥 認可・API保護など APIに権限を設定していなかったり、アク セストークンや認可チェックが不十分だ
と管理者用APIを呼び出せてしまう可能 性がある
アジェンダ • 代表的なセキュリティリスク • セキュリティリスクへの対策 👈 • 実装例 • まとめ
XSSに対応する 前提 ・ React(JSX)では {Value} とブラケットで囲えばデフォルトでエスケープされるため、 基本的な対策はされている ・ただし、それだけでは不十分な場合がある ・img タグの
onerror に fetch スクリプトが書かれていて対策が不十分な場合に実 行してしまうなどがある
XSSに対応する 引用: https://vercel.com/guides/understanding-xss-attacks
ユーザが自由に入力したものを出力する場合、バリデーション・エスケープ やサニタイズが必要 XSSに対応する 📝 エスケープ スクリプトとして解釈できない文字列に 変換し、見た目は維持しながら無効化 すること < …変換...
< > …変換... > 📝 サニタイズ そもそもリスクになりうる文字列を削除 すること (DOMPurifyなどを使う) https://www.npmjs.com/package/dompurify
XSSに対応する コンテンツセキュリティポリシー( CSP)の導入 ・ CSPはブラウザ側で読み込めるコンテンツのソースを制限することができます。自分 のサイトが提供するもの以外は実行しないようにすることが出来ます。 https://vercel.com/docs/headers/security-headers ・next.config.js や、 middleware.js
に設定することも出来ます。 https://nextjs.org/docs/app/building-your-application/configuring/content-security-policy
XSSに対応する EX: クリックジャッキング対策 ・X-Frame-Options を HTTP ヘッダに追加し、iframe や frame タグで表示するコンテンツを制限するこ
と ができます。 ・next.config.js や、 middleware.js に設定することも出来ます。 https://blog.logrocket.com/using-next-js-security-headers/#:~:text=The%20%60X,not%20emb edded%20in%20other%20websites https://www.ipa.go.jp/security/vuln/websecurity/clickjacking.html
EX: MIMEスニッフィング対策 ・X-Content-Type-Options を HTTP ヘッダに追加し、ブラウザが読み込める MIME タ イプを 制限することができます。
・HTTP の仕様で、 Content-Type を指定してデータを送信することで、データの種類や 形式を伝えている ただし、ブラウザ側ではこの指定を従わずに送られたデータを自分で推測している XSSに対応する
EX: MIMEスニッフィング対策 なんで?👇 ・メディアタイプの指定がない場合や、サーバ管理者が指定を誤った場合でもコンテンツ を適切に処理するようにするために行われるもので、 ファイルの拡張子や、データの中身から推測している。 そしてContent-Typeを設定しても無視される(らしい) XSSに対応する
EX: MIMEスニッフィング対策 ・この仕様を悪用して、本来実行できないはずのファイル形式を読み込んで、 悪意あるスクリプトを実行する攻撃 ・ヘッダに X-Content-Type-Options: nosniff を指定することで、MIMEスニッフィングを行わず、 サーバがContent-Typeを指定したメディアタイプに必ず従うようになります。 XSSに対応する
アジェンダ • 代表的なセキュリティリスク • セキュリティリスクへの対策 • 実装例 👈 • まとめ
next.config.js の headers に設定する 実装例 const nextConfig = { async
headers() { return [ { source: "/(.*)", headers: [ { key: "X-Frame-Options", value: "DENY" }, { key: "Content-Security-Policy", value: "default-src 'self' 'https://example.com'; image-src 'https://unsplash.com'; script-src 'self' https://www.google-analytics.com; font-src 'self' 'https://fonts.googleapis.com'", }, { key: "X-Content-Type-Options", value: "nosniff" }, ], }, ]; }, }; module.exports = nextConfig;
実装例 レスポンスを確認するとヘッダに追加されていることがわかる
アジェンダ • 代表的なセキュリティリスク • セキュリティリスクへの対策 • 実装例 • まとめ 👈
まとめ 👉 アプリケーションの防御は色々ある • 今回はXSSについて話しましたが、CSRFやセッションハイジャックなど、色々対策する必要 があります 👉 対策の考え方 • XSSについてはデータが入力される時も大事だが、出力時に気をつけることが大事
ありがとうございました