この記事では、個人開発で私が気をつけているセキュリティ対策を紹介します。
🚨 2025年12月のセキュリティ事情
2025年12月、Next.js/Reactエコシステムで深刻な脆弱性が発見されました。個人開発でもセキュリティは他人事ではありません。
React Server Componentsの脆弱性(CVE-2025-55182)
2025年12月3日、React Server Componentsにリモートコード実行の脆弱性が公開されました。深刻度を示すCVSSスコアは10.0で、これは最高値です。
- 影響範囲: React 19.0〜19.2.0を使用するすべてのアプリケーション
- 攻撃方法: 悪意あるHTTPリクエストでサーバー上で任意のコードを実行可能
- 対象フレームワーク: Next.js、React Router、Waku、Parcel RSCなど
私が開発しているMemoreruでも、Vercelのデプロイ画面で警告が出て気づき、すぐにNext.js 15.5.9、React 19.2.3へアップデートしました。依存パッケージの更新を日頃から習慣にしていたため、スムーズに対応できました。
Node.jsの複数の脆弱性
同じく2025年12月、Node.jsにも複数の脆弱性が報告されています。
| 深刻度 | 件数 | 影響バージョン |
|---|---|---|
| High | 3件 | v20.x, v22.x, v24.x, v25.x |
| Medium | 1件 | 同上 |
| Low | 1件 | 同上 |
修正版は2026年1月7日にリリース予定とのことです(2025年12月19日時点)。
🛡️ 私が実践しているセキュリティ対策
ここからは、Memoreruの開発で実際に取り入れているセキュリティ対策を紹介します。
1. 依存パッケージの更新
最も基本的で効果的な対策は、依存パッケージを最新に保つことです。
DependabotやRenovateを設定すると、依存パッケージの更新を自動でPRにしてくれます。
2. 入力値のバリデーション
ユーザーからの入力はすべて信用しないという前提で実装しています。Zodを使うと、バリデーションと型定義を一箇所で管理できます。
APIのクエリパラメータも同様にバリデーションしています。
3. 認証・認可の実装
認証は自前実装せず、ライブラリを使っています。MemoreruではBetter Authを採用しました。Auth.jsも選択肢になります。
認可(権限チェック)も実装しています。
4. 環境変数の管理
秘密情報は環境変数で管理し、コードへのハードコードは避けています。
開発者向けの.env.exampleを用意して、必要な環境変数を明示します。
5. セキュリティヘッダーの設定
Next.jsの場合、next.config.tsでセキュリティヘッダーを設定できます。
本番環境では、HSTS(HTTP Strict Transport Security)ヘッダーも追加しています。このヘッダーを設定すると、ブラウザが自動的にHTTPSでアクセスするようになります。
6. CSRF対策
CSRF(Cross-Site Request Forgery)は、ユーザーが意図しないリクエストを送信させる攻撃です。たとえば、悪意あるサイトを開いただけで、ログイン中のサービスに対して勝手に操作が実行される可能性があります。
対策として、フォーム送信やAPIリクエストにはCSRFトークンを使っています。
7. SQLインジェクション対策
SQLインジェクションは、ユーザー入力を通じて不正なSQLを実行させる攻撃です。たとえば、ログインフォームに特殊な文字列を入力することで、認証をバイパスしたり、データを盗み出したりできてしまいます。
ORM(データベース操作をコードで書けるライブラリ)を正しく使っていれば基本的に安全ですが、生のSQLを書く場合はパラメータ化クエリを使うようにしています。
Drizzle ORMやPrismaを使えば、自動的にパラメータ化されます。
8. レートリミットの実装
レートリミットは、一定時間内のリクエスト数を制限する仕組みです。これにより、大量リクエストでサーバーを停止させるDoS攻撃や、パスワード総当たり攻撃を緩和できます。
シンプルな実装例です。
本番環境でスケールする場合は、Upstash等のRedisを使った分散レートリミットも選択肢になります。
📋 セキュリティチェックリスト
私が確認している項目をまとめます。
| カテゴリ | チェック項目 |
|---|---|
| 依存関係 | npm auditで脆弱性がないか |
| 依存関係 | 主要パッケージ(Next.js, React, Node.js)が最新か |
| 入力検証 | すべてのユーザー入力をバリデーションしているか |
| 認証 | 認証ライブラリを使っているか(自前実装していないか) |
| 認可 | リソースへのアクセス権限を確認しているか |
| 環境変数 | 秘密情報がコードにハードコードされていないか |
| ヘッダー | セキュリティヘッダーを設定しているか |
| HTTPS | 本番環境でHTTPSを強制しているか |
| CSRF | フォーム送信にCSRFトークンを使っているか |
| SQL | パラメータ化クエリまたはORMを使っているか |
| API | レートリミットを実装しているか |
🔔 脆弱性情報のキャッチアップ
セキュリティ情報を定期的にチェックする習慣をつけましょう。XなどのSNSで公式アカウントやセキュリティ情報を発信している開発者をフォローしておくと、重要な情報をいち早くキャッチできます。
- Next.js Security - Next.js公式
- React Blog - React公式
- Node.js Security Releases - Node.js公式
- IPA セキュリティアラート - 日本語での脆弱性情報
✅ まとめ
個人開発でも最低限のセキュリティ対策は必須です。
| 対策 | 優先度 | 理由 |
|---|---|---|
| 依存パッケージの更新 | 最高 | 既知の脆弱性を防ぐ |
| 入力値のバリデーション | 最高 | 多くの攻撃の入口 |
| 認証・認可 | 高 | 不正アクセスを防ぐ |
| 環境変数の管理 | 高 | 情報漏洩を防ぐ |
| セキュリティヘッダー | 高 | 設定するだけで効果あり |
| CSRF対策 | 高 | 意図しない操作を防ぐ |
| SQLインジェクション対策 | 中 | ORMで自動的に対応 |
| レートリミット | 中 | 大量リクエスト攻撃を緩和 |
「あとで対策する」は危険です。最初から基本的な対策を入れておくことで、安心して開発を続けられます。