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
4
Next.js で始めるセキュリティ入門
2025/3/27
エンジニアコミュニティ内での登壇
Shumpei O.
March 27, 2025
Tweet
Share
More Decks by Shumpei O.
See All by Shumpei O.
例外処理について考える
shumpei0111
0
130
Reactで汎用的なinputコンポーネントを考える
shumpei0111
0
40
複数人での 大規模サイト移植のテクニック
shumpei0111
1
810
個人開発者は Jamstackでブログを書こう!〜WordPressもいいけどJamstackもね〜
shumpei0111
0
97
Other Decks in Technology
See All in Technology
コードや知識を組み込む / Incorporating Codes and Knowledge
ks91
PRO
0
160
AI駆動で進化する開発プロセス ~クラスメソッドでの実践と成功事例~ / aidd-in-classmethod
tomoki10
1
800
Compose におけるパスワード自動入力とパスワード保存
tonionagauzzi
0
190
Goの組織でバックエンドTypeScriptを採用してどうだったか / How was adopting backend TypeScript in a Golang company
kaminashi
12
9.1k
AIによるコードレビューで開発体験を向上させよう!
moongift
PRO
0
350
SREからゼロイチプロダクト開発へ ー越境する打席の立ち方と期待への応え方ー / Product Engineering Night #8
itkq
2
1.1k
【Oracle Cloud ウェビナー】ご希望のクラウドでOracle Databaseを実行〜マルチクラウド・ソリューション徹底解説〜
oracle4engineer
PRO
1
140
Cross Data Platforms Meetup LT 20250422
tarotaro0129
1
920
Aspire をカスタマイズしよう & Aspire 9.2
nenonaninu
0
360
社会人力と研究力ー博士号をキャリアの武器にするー
kentaro
2
100
ここはMCPの夜明けまえ
nwiizo
32
13k
意思決定を支える検索体験を目指してやってきたこと
hinatades
PRO
0
390
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Automating Front-end Workflow
addyosmani
1370
200k
The World Runs on Bad Software
bkeepers
PRO
68
11k
The Language of Interfaces
destraynor
157
25k
Reflections from 52 weeks, 52 projects
jeffersonlam
349
20k
We Have a Design System, Now What?
morganepeng
52
7.5k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.4k
Building Applications with DynamoDB
mza
94
6.4k
Visualization
eitanlees
146
16k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.2k
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についてはデータが入力される時も大事だが、出力時に気をつけることが大事
ありがとうございました