Security SVG Diagram Generator
セキュリティ攻撃の教育用SVG図を生成するスキル。1つの攻撃タイプにつき攻撃図 + 対策図のペアを出力する。
ワークフロー
- •ユーザーから攻撃タイプを受け取る(例:
xss-reflected,csrf,sql-injection) - •
references/diagram-templates.mdで攻撃タイプに対応するテンプレート型(Flow型、中間割込型等)を確認 - •
references/svg-components.mdとreferences/design-system.mdを参照 - •攻撃の内容自体はClaudeの知識を使い、テンプレート型に沿って攻撃図SVGを生成 →
/mnt/user-data/outputs/{attack-type}-attack.svg - •同じアクター配置で対策図SVGを生成 →
/mnt/user-data/outputs/{attack-type}-defense.svg - •両ファイルを
present_filesで提示
出力ファイル構成
| ファイル | 内容 |
|---|---|
{type}-attack.svg | 攻撃フロー図(アクター、番号付き矢印、ステップ詳細、攻撃テクニックカード) |
{type}-defense.svg | 対策図(同じアクター配置に防御ポイントを重ね、攻撃が遮断される様子を表示) |
SVG設計の基本原則
レイアウト構造(攻撃図)
┌──────────────────────────────────────────────────────────────────────┐ │ タイトル + サブタイトル + OWASPカテゴリバッジ │ ├──────────────────────────────────────────┬───────────────────────────┤ │ │ 攻撃ステップ詳細 │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ ①タイトル + 説明2行 │ │ │攻撃者│ ──→ │サーバー│ ──→ │被害者│ │ ②タイトル + 説明2行 │ │ └─────┘ └─────┘ └─────┘ │ ③ ... │ │ 番号付き矢印で接続 │ ④ ... │ │ │ ⑤ ... │ │ [脆弱性ボックス] [ブラウザボックス] ├───────────────────────────┤ │ │ 凡例 │ │ [コード例] │ │ ├──────────────────────────────────────────┴───────────────────────────┤ │ 🔥 使用される攻撃テクニック │ │ [カード1: アイコン+説明] [カード2] [カード3] │ └──────────────────────────────────────────────────────────────────────┘
レイアウト構造(対策図)
┌──────────────────────────────────────────────────────────────────────┐ │ タイトル + "多層防御"バッジ │ ├──────────────────────────────────────────┬───────────────────────────┤ │ │ 防御レイヤー一覧 │ │ [WAF] ┌─────┐ ✗ ┌─────┐ │ ①レイヤー名 + 説明 │ │ │サーバー│ ──✗──→ │被害者│ │ ②... │ │ ┌─────┐└─────┘ └─────┘ │ ③... │ │ │攻撃者│ (薄く表示) │ ④... │ │ └─────┘ │ │ │ │ 🔒多層防御 │ │ [入力サニタイズ] [CSPヘッダー] ├───────────────────────────┤ │ │ 凡例 │ │ [HttpOnly Cookie] │ │ └──────────────────────────────────────────┴───────────────────────────┘
重要なルール
- •viewBox設定: 必ず全要素が収まるサイズを設定。右サイドバーの右端が
viewBox幅 - 20px以内に収まること - •矢印と要素の分離: 番号バッジは矢印ラインから最低20px離す。対向する矢印(②③など)はY座標を40px以上離し、バッジは上下に分散配置
- •曲線矢印のルーティング: アクター間を大きく回る矢印は、他のボックス要素(脆弱性表示、コード例、防御カード等)と重ならないよう制御点を十分に離す(最低60px以上のマージン)
- •テキスト重複防止: 全テキスト要素は他の要素と重ならないことを確認。特に矢印パスがテキスト領域を横切らないこと
- •カラーコーディング: 攻撃=赤系、サーバー応答=青系、ユーザー通信=紫系、防御=緑系を一貫して使用
要素の重なり防止(必須チェック)
SVG生成後、以下のチェックを必ず実施すること。要素が重なると文字が読めなくなり、図の品質が大きく低下する。
バウンディングボックスの計算ルール
各要素の占有領域(バウンディングボックス)を transform の translate(x, y) とその内部の rect / circle / text 座標から計算し、要素間の重なりがないことを確認する。
例: <g transform="translate(385, 150)"> 内の <rect x="-58" y="-55" width="116" height="155"> → 絶対座標: x=[327, 443], y=[95, 250] 例: <g transform="translate(465, 270)"> 内の <circle r="16"> → 絶対座標: x=[449, 481], y=[254, 286]
最低マージン
| 要素の組み合わせ | 最低マージン |
|---|---|
| カード同士 | 40px以上 |
| カードとブロックマーク(✗) | 10px以上 |
| カードと矢印ライン | テキストを含む場合は20px以上 |
| 防御カードとアクターカード | 20px以上 |
| 凡例と他の要素 | 30px以上 |
よくある重なりパターンと対策
- •防御カード同士の重なり: カードを横並び or 十分なY間隔(90px以上)で縦配置
- •ブロックマーク(✗)と防御壁カードの重なり: 防御壁カードの下端がブロックマークの上端より上にあることを確認。カードを上に移動するか、ブロックマークを右にずらして回避
- •矢印パスが大きなカードを貫通: カードの外を迂回するか、カードのサイズ・位置を調整
- •viewBox不足による下部要素のはみ出し: 全要素の最下端 + 20px をviewBox高さに設定
コンポーネント参照
SVGの各コンポーネント(アクター、矢印、カード等)の具体的なSVGコードは references/svg-components.md を参照。
デザインシステム
色、フォント、間隔などの定数は references/design-system.md を参照。
テンプレート型
攻撃タイプごとのレイアウトパターン(Flow型、中間割込型、集中型、階層型、Timeline型)とアクター配置・矢印ルーティングの定義は references/diagram-templates.md を参照。攻撃の内容(ステップ、脆弱性、防御策)はClaudeの知識を使って記述する。
実装例
assets/ ディレクトリに以下のプロトタイプを格納。新しい攻撃タイプのSVGを生成する際はこれらを参考にすること。
- •
assets/xss-reflected-attack.svg— 攻撃図の完成例 - •
assets/xss-reflected-defense.svg— 対策図の完成例
テーマ
デフォルトはダークモード。ユーザーが指定した場合はライトモードに切り替え可能(references/design-system.md に両テーマの色定義あり)。
言語
デフォルトは日本語メイン + 英語サブ(バイリンガル表示)。ユーザー指定で英語のみにも切替可能。