angular-security について
Angular 開発者向けに、XSS、CSRF、CSP、入力検証を扱うセキュリティスキルです。Trusted Types、DomSanitizer、HttpClient、ルートガードについても解説します。
主な機能
- 01DomSanitizer による HTML の安全な処理
- 02HttpClient の CSRF 設定ガイダンス
- 03Trusted Types と CSP のガイド
- 04動的なテンプレート評価の回避
- 05ルートガードと入力検証
活用シーン
- 01ユーザー提供 HTML の安全な表示
- 02HTTP リクエストへの CSRF 対策の設定
- 03Angular アプリのコンテンツセキュリティポリシー強化
- 04保護されたルートへの未認証アクセス制限
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ oguzhan18/ angular-ecosystem-skills --skill angular-securityインストール後、Claude Code で/angular-securityを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/discussions/_INDEX.mdreferences/docs/_INDEX.mdreferences/issues/_INDEX.mdreferences/releases/_INDEX.md詳細
Angular セキュリティ
バージョン: Angular 21(2025) タグ: セキュリティ、XSS、CSRF、CSP、サニタイズ
参考資料: セキュリティガイド • DomSanitizer
API の変更点
このセクションでは、最近のバージョン固有の API の変更点について説明します。
-
新機能:Trusted Types — Angular は CSP 向けに Trusted Types をサポートします
-
新機能:HttpClient の CSRF — CookieXSRFStrategy による組み込みの CSRF 保護
-
新機能:untrustedEvents を使用する provideZoneChangeDetection — Zone.js のイベントフィルタリング
-
新機能:afterNextRender のセキュリティ — レンダリング後にコードを安全に実行します
ベストプラクティス
- 安全な HTML には DomSanitizer を使用します
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
constructor(private sanitizer: DomSanitizer) {}
getSafeHtml(html: string): SafeHtml {
return this.sanitizer.bypassSecurityTrustHtml(html);
}
- bypassSecurityTrust メソッドは慎重に使用します
// Only use when content is trusted
this.safeUrl = this.sanitizer.bypassSecurityTrustUrl(userInput);
this.safeScript = this.sanitizer.bypassSecurityTrustScript(script);
this.safeStyle = this.sanitizer.bypassSecurityTrustStyle(style);
this.safeResourceUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);
- CSRF 保護には HttpClient を使用します
// Automatically uses XSRF-TOKEN cookie
http.get('/api/data').subscribe();
// Configure CSRF
provideHttpClient(
withXsrfConfiguration({
cookieName: 'XSRF-TOKEN',
headerName: 'X-XSRF-TOKEN'
})
)
- サニタイズを適用して innerHTML を使用します
@Component({
template: `<div [innerHTML]="safeContent"></div>`
})
export class MyComponent {
// Angular sanitizes automatically
safeContent = '<p>Safe content</p>';
}
- 動的なテンプレート評価は避けます
// ❌ Dangerous
eval(userInput);
// ✅ Safe - use Angular's binding
{{ userInput }}
- Content Security Policy を使用します
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self'">
- Trusted Types を使用します
import { provideTrustedTypes } from '@angular/core';
export const appConfig: ApplicationConfig = {
providers: [
provideTrustedTypes()
]
};
- ユーザー入力を検証します
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({ name: 'escapeHtml' })
export class EscapeHtmlPipe implements PipeTransform {
transform(value: string): string {
return value
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"');
}
}
- 認証には HttpClient インターセプターを使用します
export const authInterceptor: HttpInterceptorFn = (req, next) => {
const token = inject(AuthService).getToken();
if (token) {
const authReq = req.clone({
setHeaders: { Authorization: `Bearer ${token}` }
});
return next(authReq);
}
return next(req);
};
- ルートの保護にはルーターガードを使用します
export const authGuard: CanActivateFn = () => {
const auth = inject(AuthService);
const router = inject(Router);
if (auth.isAuthenticated()) {
return true;
}
return router.createUrlTree(['/login']);
};
コメント
Markdown 対応