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
14
0
Share
Next.js で始めるセキュリティ入門
2025/3/27
エンジニアコミュニティ内での登壇
Shumpei O.
March 27, 2025
More Decks by Shumpei O.
See All by Shumpei O.
例外処理について考える
shumpei0111
0
230
Reactで汎用的なinputコンポーネントを考える
shumpei0111
0
180
複数人での 大規模サイト移植のテクニック
shumpei0111
1
990
個人開発者は Jamstackでブログを書こう!〜WordPressもいいけどJamstackもね〜
shumpei0111
0
170
Other Decks in Technology
See All in Technology
Chart.js が簡単に使えるようになっていたので OGP 画像生成に使った話
kamekyame
0
140
Cloud Run のアップデート 触ってみる&紹介
gre212
0
300
Diagnosing performance problems without the guesswork
elenatanasoiu
0
160
Platform Engineering as a Product: Criteria for Improvement and Multi-Tenant Design
kumorn5s
0
490
BigQuery の Cross-cloud Lakehouse への歩み
phaya72
2
540
AI活用を推進するために ファインディが下した、一つの小さな決断
starfish719
0
220
AI-DLCを活用した高品質・安全なAI駆動開発実践 / AI Driven Development with AI-DLC
yoshidashingo
0
110
ポケモンの型をTypeScriptの型システムで表現してみた
subroh0508
0
160
Oracle Cloud Infrastructure IaaS 新機能アップデート 2026/3 - 2026/5
oracle4engineer
PRO
1
160
ChatworkとBPaaS 異なる特性で学んだAI機能開発の ベストプラクティス
kubell_hr
2
2.3k
OpenID Connectによるサービス間連携
takesection
0
160
チームで実践する AI-DLC 思考の軌跡を残すチェックポイント設計
belongadmin
0
2.1k
Featured
See All Featured
Statistics for Hackers
jakevdp
799
230k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
160
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
Designing for humans not robots
tammielis
254
26k
The Invisible Side of Design
smashingmag
302
52k
Raft: Consensus for Rubyists
vanstee
141
7.5k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
220
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
The browser strikes back
jonoalderson
0
1.1k
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についてはデータが入力される時も大事だが、出力時に気をつけることが大事
ありがとうございました