個人で30以上のWebアプリケーションを開発・運用する中で、各サイトのセキュリティ状況を 一元的に把握する手段がないことが課題でした。
外部のセキュリティ診断サービスは、診断対象のURLや結果を第三者サーバーに送信する必要があり、 情報漏洩や信頼性の懸念がありました。特に自分のインフラ構成やドメイン一覧が外部に渡ることは避けたいと考えました。
そこで、完全に自分のコントロール下で動作するセキュリティ診断ツールを構築。 8つの診断モジュールで多角的にWebアプリの脆弱性を検出し、A-Fグレードで可視化する仕組みを実装しました。
課題
解決策
各モジュールが並列実行され、数十秒で包括的な診断結果を返します。
HTTPレスポンスヘッダーのセキュリティ設定を包括的に検査します。
チェック項目
暗号化通信の安全性を証明書レベルで検証します。
チェック項目
反射型XSSおよびHTMLインジェクションの脆弱性を検出します。
チェック項目
SQLペイロードテストによるデータベース攻撃の脆弱性を診断します。
チェック項目
機密ファイルやサーバー情報の意図しない露出を検出します。
チェック項目
Cookie属性の適切な設定を確認し、セッションハイジャックリスクを評価します。
チェック項目
不要に公開されたポートを検出し、攻撃面を可視化します。
チェック項目
URLリダイレクト機能の悪用可能性を診断し、フィッシングリスクを評価します。
チェック項目
各診断モジュールの結果を100点満点で算出し、A-Fの5段階でグレード付与します。
| グレード | スコア範囲 | 評価 | 推奨アクション |
|---|---|---|---|
| A | 90 - 100 | 優秀 | 現状維持。定期的な監視を継続 |
| B | 80 - 89 | 良好 | 軽微な改善推奨。優先度は低い |
| C | 70 - 79 | 改善推奨 | 中程度のリスク。1ヶ月以内の対応推奨 |
| D | 50 - 69 | 要対応 | 高リスク。1週間以内の対応が必要 |
| F | 0 - 49 | 危険 | 重大な脆弱性あり。即時対応が必要 |
スコア算出方法
各モジュールが個別にスコアを算出し、それらの加重平均で総合スコアを決定。 重要度の高い項目(SSL/TLS、XSS、SQLi)は高い重みが割り当てられます。 グレードは総合スコアに基づいて自動的に付与されます。
モダンな技術スタックで構築された、高速かつ安全な診断基盤です。
| レイヤー | 技術 | 役割 |
|---|---|---|
| フロントエンド | Next.js 15 (App Router) + TypeScript + Tailwind CSS 4 | ダッシュボード、スキャン画面、レポート表示のWeb UI |
| 認証 | Supabase Auth (@supabase/ssr) | ユーザー認証・セッション管理。自分専用のアクセス制御 |
| スキャンエンジン | Node.js (tls / net / fetch API) | 8つの診断モジュールを並列実行。Streaming APIでリアルタイム進捗表示 |
| データ | Supabase (PostgreSQL) | スキャン履歴・レポートの永続化。テーブルプレフィックス: ss_ |
| デプロイ | Vercel + nextcode.ltd サブドメイン | エッジネットワークで高速配信。security.nextcode.ltd |
| CLI | npx tsx cli.ts | ターミナルからの一括スキャン実行。JSON出力対応 |
Webダッシュボードに加え、ターミナルからの一括スキャンにも対応しています。
# 単一サイトスキャン
$ npx tsx cli.ts https://samune-maker.nextcode.ltd
# 複数サイト一括スキャン(URLファイル指定)
$ npx tsx cli.ts --urls urls.txt
# JSON形式で結果出力
$ npx tsx cli.ts https://example.com --json
リアルタイム進捗表示
Streaming APIで各モジュールの診断進捗をリアルタイムに表示
URL自動同期
ポートフォリオのworks.tsからURL一覧を自動取得し、一括スキャン可能
スキャン履歴
過去の診断結果を保存し、セキュリティ状況の推移を追跡
改善提案
検出された脆弱性ごとに具体的な修正方法を提示
認証保護
Supabase Authによるアクセス制御。自分専用の管理ツール
レスポンシブUI
デスクトップ・モバイル両方で快適に操作可能