01 - OWASP トップ 10 2025: 開発者ガイド
私たちが記述するコードのすべての行には、データを保護するという暗黙の責任が伴います。 そしてユーザーの信頼。 2025 年、アプリケーション、アーキテクチャはますます複雑化 分散化と自動コード生成ツールの採用の増加により、 セキュリティはもはや後回しにはできません。そこには OWASP トップ 10 2025 を表します Web アプリケーションの最も重大な 10 件の脆弱性に関する最新のリファレンス、およびすべての 開発者はそれをよく知っている必要があります。
このガイドでは、新しいリストの 10 カテゴリーすべてを分析しますが、特に次の点に焦点を当てています。 2025年に導入される2つの新しいカテゴリー: ソフトウェア サプライ チェーンの障害 (A03) e 例外的な条件の誤った処理 (A10)。それぞれの脆弱性について明確な説明があり、 脆弱で安全なコード TypeScript/Node.js と具体的なベスト プラクティス 角度用。
何を学ぶか
- OWASP 2025 の全 10 カテゴリ (2 つの新しいカテゴリを含む)
- 2021年版との主な違い
- 脆弱なコードとその対策例
- npm 依存関係のサプライ チェーンを保護する方法
- AI が生成したコードの 45% がセキュリティ テストに合格しない理由
- アプリケーションを保護するための Angular 固有のチェックリスト
OWASP とは何か、トップ 10 はどのようにして生まれたのか
La オープン ワールドワイド アプリケーション セキュリティ プロジェクト (OWASP) そして財団 世界レベルでソフトウェアのセキュリティを向上させることを目的として 2001 年に設立された非営利団体 グローバル。彼の最も有名なプロジェクトは、 OWASP トップ 10: の文書 Web アプリケーションの最も重大な脆弱性 10 件をリストしたリファレンスを更新 数百の組織から収集された実際のデータに基づいて定期的に実行されます。
このリストは、数百万のアプリケーションと数十万のアプリケーションを分析して編集されています。 脆弱性。プロセスが組み合わさって、 経験的データ (実際の事故、報告書 セキュリティ、自動分析) コミュニティ調査 集めるもの 新たな脅威に対するセキュリティ専門家の懸念。各カテゴリーマップ 1つ以上の CWE (共通の弱点の列挙)、または標準分類 ソフトウェアの弱点について。
以前のバージョン
OWASP トップ 10 には、2004 年、2007 年、2010 年、2013 年、2017 年、2021 年、そして今回の 2025 年といういくつかのエディションがありました。 各アップデートは脅威の進化を反映しています。 2017 年には注射が第 1 位でした 場所; 2021 年には、Broken Access Control がそれらを上回りました。 2025 年には変化が見られる これは、 ソフトウェア開発の現代の課題。
2025 年の OWASP トップ 10 の新機能
2025 年版では、2021 年と比較して重要な変更が加えられています。以下に完全なリストを示します。 位置の変更:
| 位置 | OWASP 2025 | 2021年からの変更点 |
|---|---|---|
| A01 | 壊れたアクセス制御 | #1 で確認されました (A01:2021 でした)。 SSRF が含まれるようになりました |
| A02 | セキュリティの構成ミス | #5から#2に上がる |
| A03 | ソフトウェアサプライチェーンの障害 | 新規 - A06:2021 (脆弱なコンポーネント) を拡張 |
| A04 | 暗号化の失敗 | 2位から4位に下がります |
| A05 | 注射 | #3から#5にドロップ |
| A06 | 安全でない設計 | #4から#6にドロップ |
| A07 | 認証の失敗 | #7で確認しました |
| A08 | ソフトウェアまたはデータの整合性の障害 | #8で確認済み |
| A09 | セキュリティのログ記録とアラートの失敗 | #9 で確認済み (名前変更:「モニタリング」ではなく「アラート」) |
| A10 | 例外的な条件の取り扱いを誤る | NEW - SSRF を置き換えます (現在は A01 に組み込まれています) |
2 つの重要な変更点
A03: ソフトウェア サプライ チェーンの障害 - サプライチェーンへの攻撃 ソフトウェアの数は近年爆発的に増加しています。このカテゴリーは投票で選ばれました OWASP コミュニティ調査では最大の懸念事項でした。タイポスクワッティングをカバーし、 依存関係の混乱、悪意のあるパケット、侵害された CI/CD パイプライン。
A10: 例外的な条件の取り扱いを誤る - 不適切な管理 エラーや例外を検出し、自律的な攻撃ベクトルとして認識されるようになりました。含まれるもの 24 不適切なエラー処理、フェールオープン、機密情報の漏洩に関連する CWE エラーメッセージ経由で。
A01:2025 - 壊れたアクセス制御
Il 壊れたアクセス制御 4年連続1位を堅守 連続的な。ユーザーがリソースにアクセスできるか、アクションを実行できるときに発生します。 彼には権限がありません。最も一般的な形式は次のとおりです。 アイドル (安全でない直接オブジェクト参照)、 パストラバーサル、制御バイパス ロール、およびトークンまたは URL パラメーターの操作。
2025 年には、このカテゴリは SSRFを組み込んだ (サーバー側のリクエスト偽造)、 2021 年バージョンでは A10 の位置を占めていました。ロジックは、SSRF が次のことを表しているということです。 基本的にはアクセス制御の失敗です。サーバーは次のリクエストを行います。 到達すべきではないリソース。
例: IDOR (安全でない直接オブジェクト参照)
// VULNERABILE: nessun controllo di ownership
app.get('/api/users/:id/profile', async (req, res) => {
// Chiunque può vedere il profilo di qualsiasi utente cambiando l'ID
const user = await User.findById(req.params.id);
res.json(user);
});
// SICURO: verifica ownership + ruolo
app.get('/api/users/:id/profile', authenticate, async (req, res) => {
if (req.user.id !== req.params.id && req.user.role !== 'admin') {
return res.status(403).json({ error: 'Accesso non autorizzato' });
}
const user = await User.findById(req.params.id);
if (!user) {
return res.status(404).json({ error: 'Utente non trovato' });
}
res.json(user);
});
例: パストラバーサル
import path from 'path';
// VULNERABILE: l'utente controlla il percorso del file
app.get('/api/files/:filename', (req, res) => {
// Un attaccante può richiedere: ../../../etc/passwd
res.sendFile(`/uploads/${req.params.filename}`);
});
// SICURO: normalizza e valida il percorso
const UPLOAD_DIR = '/var/www/uploads';
app.get('/api/files/:filename', authenticate, (req, res) => {
const filename = path.basename(req.params.filename);
const filePath = path.join(UPLOAD_DIR, filename);
// Verifica che il percorso risolto sia dentro UPLOAD_DIR
if (!filePath.startsWith(UPLOAD_DIR)) {
return res.status(400).json({ error: 'Percorso non valido' });
}
res.sendFile(filePath);
});
壊れたアクセス制御に対する Angular 防御
- 埋め込む ルートガード (
canActivate,canMatch) 予約されたルートを保護するため - を使用します。 HTTP インターセプター 各リクエストに JWT トークンを自動的に添付する
- 権限に基づいて UI 要素を非表示にしますが、 サーバー側では常に有効です
- バックエンド側を確認せずに、ロールや権限を localStorage に挿入しないでください。
- 認可ロジックを 1 つに集中化 認証サービス 再利用可能
A02:2025 - セキュリティの構成ミス
Le セキュリティの構成ミス 2025 年には 5 位から 2 位に上昇します。 この飛躍は、構成がますます複雑になるという現実の事実を反映しています。 (クラウド、コンテナ、マイクロサービス、CDN)、構成エラーが 1 つになっている 侵害の最も頻繁な原因の 1 つです。
このカテゴリには、変更されていないデフォルト設定、安全な HTTP ヘッダーが含まれます。 欠落している、CORS が寛容すぎる、本番環境でスタック トレースが公開されている、ポートとサービスが公開されていない 必要な機能は公開され、デバッグ機能はアクティブなままになります。
セキュリティヘッダーとCORS
import helmet from 'helmet';
import cors from 'cors';
const app = express();
// Header di sicurezza con Helmet
app.use(helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'"],
styleSrc: ["'self'", "https://fonts.googleapis.com"],
imgSrc: ["'self'", "data:", "https:"],
fontSrc: ["'self'", "https://fonts.gstatic.com"],
connectSrc: ["'self'", "https://api.tuodominio.com"],
frameAncestors: ["'none'"], // Protegge da clickjacking
objectSrc: ["'none'"],
}
},
referrerPolicy: { policy: 'strict-origin-when-cross-origin' },
hsts: { maxAge: 31536000, includeSubDomains: true, preload: true },
}));
// CORS restrittivo
app.use(cors({
origin: ['https://tuodominio.com'],
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
credentials: true,
maxAge: 86400 // Cache preflight per 24 ore
}));
よくある設定エラー
Access-Control-Allow-Origin: *生産中- エラー応答に完全なスタック トレースが表示される
- デフォルトの認証情報は変更されません (admin/admin)
- 運用環境で公開されるデバッグ ポート (Node.js の場合は 9229)
- ファイル
.env公的にアクセス可能な - Webサーバーでディレクトリリストが有効化されました
A03:2025 - ソフトウェア サプライ チェーンの障害 (新規)
これは、OWASP Top 10 2025 の最も重要な新機能の 1 つです。 ソフトウェアサプライチェーンの障害 以前の A06:2021 (脆弱性) を拡張します。 および古いコンポーネント)を使用して、依存関係だけでなく、より広い範囲をカバーします。 脆弱ではありますが、ソフトウェア全体の構築、配布、更新のエコシステムは脆弱です。
2025 年に、このカテゴリーは最高の平均発生率 (5.19%) を記録しました。 テストした場合、すべてのカテゴリにわたって。最大の懸念事項にも選ばれました OWASP コミュニティ調査で、セキュリティ専門家が検討しているレポート サプライチェーン攻撃は、最も急速に増大する脅威として挙げられます。
サプライチェーンに対する攻撃の種類
ソフトウェア サプライ チェーン攻撃はさまざまな形で発生します。 さまざまな特徴と洗練のレベル:
- タイポスクワッティング: 人気のライブラリに似た名前を持つ悪意のあるパッケージ (例:
lodahsの代わりにlodash,expresの代わりにexpress) - 依存関係の混乱: 内部パッケージと同じ名前のパブリック パッケージが、正規のパッケージの代わりにインストールされる
- アカウント乗っ取り: メンテナーアカウントを侵害して、正規のパッケージに悪意のあるコードを挿入する
- ビルドパイプラインポイズニング: ビルドプロセス中に悪意のあるコードをCI/CDパイプラインに挿入する
- ずぼらしゃがむ: AI(幻覚)が発明した依存関係名を攻撃対象として悪用するパッケージ
実際の事故: 2025 年 9 月
2025 年 9 月、フィッシング キャンペーンにより npm メンテナー アカウントが侵害されました。 その結果、数十億ダウンロードに及ぶ少なくとも 27 のパッケージが侵害される 毎週。 Shai-Hulud と呼ばれる自己複製ワームが 500 以上のパッケージに感染 中和される前に。この事件は、保護がいかに重要であるかを示しています サプライチェーンの。
サプライチェーンの実践的な防御策
# 1. Usa npm ci (non npm install) per rispettare il lockfile
npm ci
# 2. Audit delle vulnerabilità in CI/CD
npm audit --audit-level=high
# 3. Verifica le firme dei pacchetti (npm 9+)
npm audit signatures
# 4. Blocca i registry non autorizzati in .npmrc
registry=https://registry.npmjs.org/
@mycompany:registry=https://npm.mycompany.com/
# 5. Genera e verifica SBOM (Software Bill of Materials)
npx @cyclonedx/cyclonedx-npm --output-file sbom.json
// package.json - usa versioni esatte, non range
{
"dependencies": {
"express": "4.21.2",
"helmet": "8.0.0",
"cors": "2.8.5"
},
"overrides": {
"vulnerable-transitive-dep": "2.1.0"
}
}
Angular プロジェクトのサプライ チェーン チェックリスト
- 走る
npm auditすべての CI/CD パイプラインでブロッキングしきい値を設定 - アメリカ合衆国 依存ボット o 改修する 自動アップデート用
- をアクティブ化します。 2FA すべてのメンテナー npm アカウント
- パッケージをインストールする前に、パッケージのソースを確認してください (
npm info) - を生成します。 SBOM リリースごとに専用ツールで監視する
- アメリカ合衆国
npm ci(ないnpm install) すべての自動化された環境で - 1 つを構成する ホワイトリスト の認可されたレジストリの
.npmrc
A04~A07: 確認済みカテゴリーの概要
A04:2025 - 暗号化の失敗
2 位から 4 位に下がりましたが、依然として重大な脆弱性が残っています。 It concerns the inadequate protection of 機密データ: クリアテキストまたは弱いハッシュ (MD5、SHA1) で保存されたパスワード、暗号キー ソースコード内のハードコーディング、HTTPS を使用しないデータ送信、時代遅れの暗号化アルゴリズム。
import bcrypt from 'bcrypt';
import crypto from 'crypto';
// VULNERABILE: MD5 non e sicuro per le password
const insecureHash = crypto.createHash('md5').update(password).digest('hex');
// SICURO: bcrypt con salt rounds adeguato
const SALT_ROUNDS = 12;
const secureHash = await bcrypt.hash(password, SALT_ROUNDS);
// SICURO: verifica password senza timing attack
const isValid = await bcrypt.compare(inputPassword, storedHash);
A05:2025 - 注射
インジェクションが 3 位から 5 位に減少しました。これは、対策 (ORM、パラメータ化されたクエリ、 消毒剤)が普及しました。しかし、それらは依然として危険です。 SQLインジェクション、NoSQLを含む インジェクション、コマンド インジェクション、LDAP インジェクション、および XSS。
// VULNERABILE: concatenazione diretta
const query = `SELECT * FROM users WHERE email = '${userInput}'`;
// Input malevolo: ' OR '1'='1' --
// SICURO: query parametrizzate (PostgreSQL)
const result = await pool.query(
'SELECT * FROM users WHERE email = $1',
[userInput]
);
// SICURO: ORM con sanitizzazione automatica (TypeORM)
const user = await userRepository.findOneBy({
email: userInput // TypeORM sanitizza automaticamente
});
A06:2025 - 安全でない設計
の欠陥に関するものです。 デザイン 実装ではなく、アプリケーションの。 脅威モデリングの欠如、最小特権の原則の尊重の失敗、および レート制限などの制御の省略はすべて、安全でない設計の例です。の 主な違い: 安全な設計には実装のバグがある可能性がありますが、安全でない設計には より良いコードだけでは解決できません。
A07:2025 - 認証の失敗
認証の失敗には、弱いパスワードの受け入れ、セッションの失敗などが含まれます。 有効期限なし、有効期限なし、または弱いシークレットを持つ JWT トークン、および多要素なし 認証。主な防御策は、有効期限の短い JWT、リフレッシュ トークンを実装することです。 資格情報の安全かつ厳格な検証。
A08~A09: 整合性と監視
A08:2025 - ソフトウェアまたはデータの整合性エラー
このカテゴリは、信頼の維持と整合性の検証に重点を置いています。 ソフトウェア、コード、アーティファクトを供給よりも細かいレベルで提供 チェーン(A03)。含まれるもの: 整合性チェックなしの CI/CD パイプライン、自動更新なし 署名の検証、信頼できないデータの逆シリアル化、および 外部リソースのサブリソース整合性 (SRI)。
<!-- VULNERABILE: script esterno senza verifica -->
<script src="https://cdn.example.com/lib.js"></script>
<!-- SICURO: SRI verifica l'integrita del file -->
<script
src="https://cdn.example.com/lib.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/ux..."
crossorigin="anonymous">
</script>
A09:2025 - セキュリティのログ記録とアラートの失敗
2025 年に名称変更し、強調するために「モニタリング」の代わりに「アラート」を追加 イベントを記録するだけでなく、イベントを生み出すことの重要性 アクティブなアラート 異常が発生したとき。構造化されたロギングとアラートがなければ、侵害が残る可能性があります 何ヶ月も検出されませんでした。
import winston from 'winston';
const securityLogger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
defaultMeta: { service: 'auth-service' },
transports: [
new winston.transports.File({ filename: 'security.log' }),
]
});
// Eventi CRITICI da loggare e per cui generare alert
function logFailedLogin(email: string, ip: string): void {
securityLogger.warn({
event: 'FAILED_LOGIN',
email,
ip,
timestamp: new Date().toISOString(),
alert: true // Flag per il sistema di alerting
});
}
// REGOLA: 5 login falliti dallo stesso IP = alert immediato
// REGOLA: accesso admin da IP sconosciuto = alert immediato
// REGOLA: modifica permessi fuori orario = alert immediato
ログに記録するもの (ログに記録しないもの)
- ログ: ログインの成功/失敗、アクセスの拒否 (403)、機密データの変更、管理者のアクション
- ログに記録しないでください: パスワード、トークン、クレジット カード番号、完全な個人データ
- 異常なログイン パターン、異常な地理的位置からのアクセス、4xx/5xx エラー ピークに関するアラートを生成します。
A10:2025 - 例外的な条件の誤った処理 (新規)
2025 年の 2 番目のビッグ ニュース。このカテゴリには次の内容が含まれます。 24CWE エラー、例外、異常な状態の不適切な処理に関連するもの。コンセプト キーと 「フェールオープン」: アプリケーションでエラーが発生したとき、 アクセスを許可するか、ブロックする代わりに操作を続行するかを選択します。
例外的な状態は、入力の欠落または不完全、環境状態によって発生する可能性があります。 予期しないイベント (メモリ、ネットワーク、権限)、遅延エラーの代わりに高レベルでの処理 例外が発生する場所、および例外はまったく処理されません。
このカテゴリの CWE キー
- CWE-209: 機密情報を含むエラー メッセージ
- CWE-234: 不足しているパラメータの処理に失敗しました
- CWE-274: 不十分な権限の不適切な管理
- CWE-476: Null ポインタの逆参照
- CWE-636: 「フェールオープン」 - 安全に失敗しないでください
例: 認証におけるフェールオープン
// VULNERABILE: fail-open - in caso di errore l'utente passa
async function verifyToken(req: Request, res: Response, next: NextFunction) {
try {
const token = req.headers.authorization?.split(' ')[1];
const decoded = jwt.verify(token!, process.env.JWT_SECRET!);
req.user = decoded;
next();
} catch (error) {
// ERRORE CRITICO: in caso di eccezione, si prosegue comunque!
console.log('Token verification failed, continuing...');
next(); // L'utente non autenticato accede alle risorse protette
}
}
// SICURO: fail-closed - in caso di errore l'accesso e negato
async function verifyToken(req: Request, res: Response, next: NextFunction) {
try {
const token = req.headers.authorization?.split(' ')[1];
if (!token) {
return res.status(401).json({ error: 'Token mancante' });
}
const decoded = jwt.verify(token, process.env.JWT_SECRET!);
req.user = decoded;
next();
} catch (error) {
// CORRETTO: in caso di errore, si blocca l'accesso
return res.status(401).json({ error: 'Autenticazione fallita' });
}
}
例:エラーによる情報漏洩
// VULNERABILE: espone dettagli interni del sistema
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
res.status(500).json({
error: err.message,
stack: err.stack, // Rivela percorsi del file system
query: (err as any).sql, // Rivela struttura del database
config: (err as any).config // Potrebbe rivelare credenziali
});
});
// SICURO: messaggi generici in produzione, dettagli solo in sviluppo
const isProduction = process.env.NODE_ENV === 'production';
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
// Logga i dettagli internamente
securityLogger.error({
message: err.message,
stack: err.stack,
url: req.originalUrl,
method: req.method,
ip: req.ip
});
// Restituisci solo un messaggio generico al client
res.status(500).json({
error: isProduction
? 'Si e verificato un errore. Riprova più tardi.'
: err.message
});
});
例: 不適切な管理によるリソースの枯渇
// VULNERABILE: il file handle non viene rilasciato in caso di errore
async function processUpload(filePath: string): Promise<void> {
const handle = await fs.open(filePath, 'r');
const data = await handle.readFile(); // Se fallisce, il handle resta aperto
await processData(data);
await handle.close();
}
// SICURO: pattern try/finally per garantire il rilascio delle risorse
async function processUpload(filePath: string): Promise<void> {
let handle: fs.FileHandle | null = null;
try {
handle = await fs.open(filePath, 'r');
const data = await handle.readFile();
await processData(data);
} catch (error) {
securityLogger.error({ event: 'UPLOAD_FAILED', filePath, error });
throw new AppError('Elaborazione file fallita', 500);
} finally {
if (handle) {
await handle.close(); // Sempre eseguito, anche in caso di errore
}
}
}
基本原則: フェールクローズ
セキュリティコンテキストで例外が発生するたびに、システムは次のことを行う必要があります。 デフォルトでアクセスを拒否する (フェールクローズ)、決して許可しないでください (フェールオープン)。 これは、認証、認可、入力検証、およびあらゆる決定に適用されます。 それは安全性に影響します。
焦点: AI によって生成されたコードのセキュリティ
AI コーディング ツール (Copilot、ChatGPT、Claude、Cursor) の大規模な採用により、 自動的に生成されたコードのセキュリティという新たなリスクが生じます。によると、 Veracode の GenAI コード セキュリティ レポート 2025、コードを解析した人 80 の実際のタスクに対して 100 を超える LLM によって生成された結果は憂慮すべきものです。
AIセキュリティの数字
- 45% AI によって生成されたコード サンプルがセキュリティ テストに不合格となり、OWASP トップ 10 の脆弱性が導入される
- 72% AI 生成の Java コードの失敗率
- 38-45% Python、C#、JavaScript の失敗率
- 86% クロスサイト スクリプティングの特定の失敗率 (CWE-80)
- 88% ログインジェクションの特定の失敗率 (CWE-117)
問題は改善されない
AI モデルは、セキュリティに関して約半分の確率で間違った選択をします。 これは、より大きなモデルでは改善されません。問題は 全身的な: モデルは公開コードでトレーニングされており、多くの場合、同じ脆弱性が含まれています それは避けるべきです。 AI によって生成されたコードには常にセキュリティ レビューが必要です 人間。
AI 生成コードのセキュリティ チェックリスト
- AI が生成したコードをそのまま受け入れないでください セキュリティコードの見直し
- データベース クエリが次のとおりであることを確認します。 パラメータ化された (連結なし)
- ユーザー入力が正しいことを確認してください 検証され、サニタイズされた あらゆる点で
- 秘密が漏洩していないことを確認してください ハードコードされた 生成されたコード内で
- エラー処理を確認してください - そうでなければなりません フェールクローズ、フェールオープンではありません
- 権限と認可を確認する: AI はアクセス制御なしでコードを生成することがよくあります
- 走る SAST (静的アプリケーション セキュリティ テスト) AI が生成したすべてのコードで自動化
Angular 固有のセキュリティ チェックリスト
Angular には多くのセキュリティ保護機能が組み込まれていますが、それらを理解しておくことが重要です 不用意に無効にしないでください。 Angular アプリケーションに固有のチェックリストは次のとおりです。
統合された XSS 保護
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
// Angular sanitizza automaticamente il binding nel template
// Le doppie graffe eseguono l'escape dell'HTML automaticamente
// PERICOLOSO: bypassare il sanitizer
@Component({
template: `<div [innerHTML]="trustedHtml"></div>`
})
export class UnsafeComponent {
trustedHtml: SafeHtml;
constructor(private sanitizer: DomSanitizer) {
// SOLO se il contenuto e completamente fidato e sotto il tuo controllo
this.trustedHtml = this.sanitizer.bypassSecurityTrustHtml(content);
}
}
// SICURO: lasciare che Angular sanitizzi automaticamente
@Component({
template: `<div [textContent]="userContent"></div>`
})
export class SafeComponent {
userContent = ''; // Angular esegue l'escape automaticamente
}
HttpClient とセキュリティ インターセプター
import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';
import { inject } from '@angular/core';
import { Router } from '@angular/router';
import { catchError, throwError } from 'rxjs';
export const authInterceptor: HttpInterceptorFn = (req, next) => {
const router = inject(Router);
const token = getStoredToken(); // Da un servizio sicuro
// Aggiungi il token solo alle richieste verso la tua API
const secureReq = req.url.startsWith('/api')
? req.clone({
setHeaders: { Authorization: `Bearer ${token}` }
})
: req;
return next(secureReq).pipe(
catchError((error: HttpErrorResponse) => {
if (error.status === 401) {
// Token scaduto o invalido: redirect al login
router.navigate(['/login']);
}
// Non esporre dettagli dell'errore nell'interfaccia
return throwError(() => new Error('Richiesta fallita'));
})
);
};
Functional API を使用したルート ガード
import { CanActivateFn, Router } from '@angular/router';
import { inject } from '@angular/core';
export const authGuard: CanActivateFn = (route, state) => {
const authService = inject(AuthService);
const router = inject(Router);
if (!authService.isAuthenticated()) {
// Redirect al login con URL di ritorno
router.navigate(['/login'], {
queryParams: { returnUrl: state.url }
});
return false;
}
// Verifica ruolo se richiesto dalla rotta
const requiredRole = route.data?.['role'];
if (requiredRole && !authService.hasRole(requiredRole)) {
router.navigate(['/unauthorized']);
return false;
}
return true;
};
Angular のコンテンツ セキュリティ ポリシー
Content-Security-Policy:
default-src 'self';
script-src 'self' 'nonce-RANDOM_VALUE';
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
font-src 'self' https://fonts.gstatic.com;
img-src 'self' data: https:;
connect-src 'self' https://api.tuodominio.com;
frame-ancestors 'none';
base-uri 'self';
form-action 'self';
Angular 最終チェックリスト
- 使用しないでください
bypassSecurityTrustHtmlユーザーコンテンツ付き - アメリカ合衆国
HttpClientトークンインターセプターと集中エラー管理を備えた - 埋め込む 機能的なルートガード すべての保護されたルートに対して
- 1 つを構成する 制限的な CSP Angular アプリケーションを提供するサーバー上
- JWT トークンを保存しないでください。
localStorage: クッキーを好むHttpOnly - 有効 常にサーバー側: Angular ガードは UI のみを保護し、API は保護しません
- 旗を使用する
--subresource-integrityinng buildSRI ハッシュを生成する - Angular を常に最新の状態に保つ: すべてのバージョンにセキュリティ パッチが含まれています
結論と行動計画
2025 OWASP トップ 10 は、急速に進化する脅威の状況を反映しています。新しい二人は カテゴリ「サプライチェーンの障害および例外的な状況の誤った処理」は追加されません アカデミック: 実際のアプリケーションに毎日影響を与える具体的な脅威を表しています。の 「セキュリティの設定ミス」が 2 位に浮上したことは、セキュリティの複雑さが裏付けられています。 最新のインフラストラクチャでは、攻撃対象領域がますます大きくなっています。
開発者の行動計画
安全姿勢を改善するための実践的な 3 ステップの手順は次のとおりです アプリケーション:
- 第 1 週 - 基礎: すべての API にアクセス制御を実装し (A01)、ヘルメットでセキュリティ ヘッダーを構成し (A02)、有効にします。
npm auditCI/CD パイプライン内 (A03) - 第 2 週 - データ保護: パスワードを bcrypt/argon2 に移行し (A04)、すべてのクエリがパラメータ化されていることを確認し (A05)、レート制限を実装します (A06)。
- 3 週目 - モニタリング: アラートを使用して構造化ログを構成し (A09)、フェールオープンを排除するためにすべての catch ブロックを確認し (A10)、依存関係 SBOM を生成します (A03)
シリーズの次の記事
今後の記事では、実践的なガイドを使用して Web セキュリティの個々の領域をさらに詳しく掘り下げていきます。 そして完全なコード:
- 第02条: XSS と CSRF - クロスサイト攻撃と Angular でのそれらの攻撃を防ぐ方法
- 第03条: SQL インジェクションと NoSQL インジェクション - Node.js と MongoDB の詳細
- 第04条: 安全な認証 - JWT、OAuth2、およびセッション
Web アプリケーションのセキュリティは、一度だけ通過するチェックポイントではありません。 連続プロセス 開発の各段階に統合する必要があります。 設計から製造まで。開発者として、私たちにはコードを書く責任があります デフォルトでは安全です。 OWASP トップ 10 の脆弱性は最低限のものを示しています 知ること。脆弱性を防ぐコストは常に脆弱性のコストよりも低くなります。 その結果に苦しむ。







