d48cda4081
CI / Test (ubuntu-latest, Node 18.x, bun) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, npm) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, pnpm) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 18.x, yarn) (push) Failing after 15m1s
CI / Test (ubuntu-latest, Node 20.x, bun) (push) Failing after 17m13s
CI / Test (ubuntu-latest, Node 20.x, npm) (push) Failing after 18m42s
CI / Test (ubuntu-latest, Node 20.x, pnpm) (push) Failing after 15m0s
CI / Test (ubuntu-latest, Node 20.x, yarn) (push) Failing after 49m44s
CI / Test (ubuntu-latest, Node 22.x, bun) (push) Failing after 51m55s
CI / Test (ubuntu-latest, Node 22.x, pnpm) (push) Failing after 21m57s
CI / Test (ubuntu-latest, Node 22.x, npm) (push) Failing after 37m39s
CI / Test (ubuntu-latest, Node 22.x, yarn) (push) Failing after 34m7s
CI / Validate Components (push) Failing after 37m15s
CI / Python Tests (push) Failing after 10m1s
CI / Security Scan (push) Failing after 10m1s
CI / Lint (push) Failing after 17m12s
CI / Coverage (push) Failing after 20m19s
CI / Test (macos-latest, Node 18.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 18.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 18.x, yarn) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 20.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 20.x, yarn) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, bun) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, npm) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, pnpm) (push) Has been cancelled
CI / Test (macos-latest, Node 22.x, yarn) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, npm) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, pnpm) (push) Has been cancelled
CI / Test (windows-latest, Node 22.x, yarn) (push) Has been cancelled
88 lines
4.0 KiB
Markdown
88 lines
4.0 KiB
Markdown
---
|
|
paths:
|
|
- "**/*.component.ts"
|
|
- "**/*.component.html"
|
|
- "**/*.service.ts"
|
|
- "**/*.interceptor.ts"
|
|
---
|
|
# Angular セキュリティ
|
|
|
|
> このファイルは [common/security.md](../common/security.md) を Angular 固有のコンテンツで拡張します。
|
|
|
|
## XSS 防止
|
|
|
|
Angular はバインドされた値を自動的にサニタイズします。ユーザー制御の入力に対してサニタイザをバイパスしないでください。
|
|
|
|
```typescript
|
|
// 誤り: サニタイゼーションをバイパス — XSS リスク
|
|
this.safeHtml = this.sanitizer.bypassSecurityTrustHtml(userInput);
|
|
|
|
// 正しい: 信頼する前に明示的にサニタイズ
|
|
this.safeHtml = this.sanitizer.sanitize(SecurityContext.HTML, userInput);
|
|
```
|
|
|
|
- 文書化されレビューされた理由なしに `bypassSecurityTrust*` メソッドを使用しない
|
|
- 信頼できないコンテンツに `[innerHTML]` を使用しない — `innerText` またはサニタイズパイプを使用
|
|
- ユーザー入力に `[href]` をバインドしない — Angular はすべてのコンテキストで `javascript:` URL をブロックするわけではない
|
|
- ユーザーデータからテンプレート文字列を構築しない
|
|
|
|
## HTTP セキュリティ
|
|
|
|
`HttpClient` のみを使用してください — 代替手段がない場合を除き、生の `fetch()` や `XHR` を使用しないでください。
|
|
|
|
```typescript
|
|
// 誤り: インターセプターをバイパス(認証ヘッダー、エラーハンドリング、ログ記録)
|
|
const res = await fetch('/api/users');
|
|
|
|
// 正しい
|
|
users$ = this.http.get<User[]>('/api/users');
|
|
```
|
|
|
|
- インターセプター経由で認証トークンを添付 — 個々のサービス呼び出しにハードコードしない
|
|
- API レスポンスを型付けしてバリデーション — 境界では外部データを `unknown` として扱う
|
|
- トークン、PII、または認証情報を含む可能性のある HTTP レスポンスをログに記録しない
|
|
|
|
## シークレット管理
|
|
|
|
```typescript
|
|
// 誤り: ソースにハードコードされたシークレット
|
|
const apiKey = 'sk-live-xxxx';
|
|
|
|
// 正しい: 環境経由で注入
|
|
import { environment } from '../environments/environment';
|
|
const apiKey = environment.apiKey;
|
|
```
|
|
|
|
- `environment.ts` を設定の形として扱う — ソース管理されている環境ファイルに実際のシークレットを格納しない
|
|
- CI/CD 経由で本番シークレットを注入(環境変数、シークレットマネージャー)
|
|
|
|
## ルートガード
|
|
|
|
すべての認証済みまたはロール制限されたルートにはガードが必要です。UI 要素の非表示だけに頼らないでください。
|
|
|
|
```typescript
|
|
{
|
|
path: 'admin',
|
|
canMatch: [authGuard, roleGuard('admin')],
|
|
loadChildren: () => import('./admin/admin.routes'),
|
|
}
|
|
```
|
|
|
|
機密性の高いルートには `canMatch` を使用してください — 未認証ユーザーに対してルートモジュールの読み込み自体を防止します。
|
|
|
|
## SSR セキュリティ
|
|
|
|
Angular SSR を使用する場合:
|
|
|
|
- 意図的に公開する場合を除き、`TransferState` 経由でサーバーサイドの環境変数をクライアントに公開しない
|
|
- サーバーサイドレンダリング前にすべての入力をサニタイズ — DOM ベースの XSS はサーバーサイドでも発生する可能性がある
|
|
- サーバー上で `window`、`document`、`localStorage` を使用しない — `isPlatformBrowser` でゲートするか、`DOCUMENT` トークン経由で注入
|
|
|
|
## コンテンツセキュリティポリシー
|
|
|
|
サーバーサイドで CSP ヘッダーを設定してください。`script-src` で `unsafe-inline` を避けてください。インラインスクリプトを使用する SSR では、Angular の CSP サポートを通じてナンスを使用してください。
|
|
|
|
## エージェントサポート
|
|
|
|
- 包括的なセキュリティ監査には **security-reviewer** スキルを使用
|