ルール
回避 再帰 なし 深さ 保護
再帰 なし 適切な 深さ 制限 リスク スタック
オーバーフロー および 生成する DoS 脆弱性を から 悪意のある
入力から 再帰 による 強制された 深さ 制限 および 適切な
境界 チェック は 許容される。
言語サポート: 45+はじめに
深度制限のない再帰関数はコールスタックを使い果たし、クラッシュを引き起こす可能性があります。深くネストされたJSONオブジェクトや循環データ構造のような悪意のある入力は、意図的に無限再帰をトリガーする可能性があります。単一の細工されたリクエストは、スタック制限を超過することでサービスをクラッシュさせ、エクスプロイトが容易なサービス拒否脆弱性を生み出します。
なぜ重要なのか
セキュリティ上の影響(DoS攻撃): 攻撃者は、深い再帰をトリガーする入力を巧妙に作成し、アプリケーションをクラッシュさせる可能性があります。深くネストされたJSON、XML、またはリンクされたデータ構造は、一般的な攻撃ベクトルです。単一の悪意のあるリクエストがスタックを使い果たし、すべてのユーザーに対してサービス全体を停止させます。
システムの安定性: スタックオーバーフローエラーは、グレースフルデグラデーションなしにプロセスを即座にクラッシュさせます。本番環境では、これはリクエストの破棄、トランザクションの中断、およびサービス利用不可を意味します。回復にはアプリケーション全体の再起動が必要です。
リソース枯渇: 無限再帰はスタックメモリを指数関数的に消費します。各再帰呼び出しはスタックフレームを追加し、深い再帰チェーンは数メガバイトのメモリを消費する可能性があります。これは同じサーバー上の他のプロセスに影響を与え、メモリ不足の状態を引き起こす可能性があります。
コード例
❌ 非準拠:
function processNestedData(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
const result = {};
for (const key in obj) {
result[key] = processNestedData(obj[key]);
}
return result;
}誤っている理由: 深度制限がないため、攻撃者はスタック制限を超える深くネストされたオブジェクトを送信できます。入力例: {a: {a: {a: {...}}}} 10,000レベルの深さまでネストすると、スタックオーバーフローでアプリケーションがクラッシュします。その関数は深さをチェックせずに無制限に再帰します。
✅ 準拠済み:
function processNestedData(obj, depth = 0, maxDepth = 100) {
if (depth > maxDepth) {
throw new Error('Maximum nesting depth exceeded');
}
if (typeof obj !== 'object' || obj === null) {
return obj;
}
const result = {};
for (const key in obj) {
result[key] = processNestedData(obj[key], depth + 1, maxDepth);
}
return result;
}これが重要である理由: 会社情報 maxDepth パラメーターは再帰を100レベルに制限し、スタックオーバーフローを防ぎます。この制限は、正当なネストされたデータ構造(ほとんどの実際のデータは10〜20レベルを超えることはめったにありません)には十分高く、かつ、大量のスタックメモリを消費する前に攻撃を阻止するのに十分低く設定されています。悪意のある深くネストされた入力は、アプリケーションをクラッシュさせる代わりにエラーをスローします。深さチェックは処理前に実行され、制限を超えた場合は迅速に失敗します。
まとめ
外部データを処理するすべての再帰関数に深度パラメーターを追加します。想定されるデータ構造の複雑さに基づいて、妥当な最大深度を設定してください。深度制限を超過した場合は、クラッシュする代わりにエラーをスローするか、デフォルト値を返します。

