ルール
コミット前に デバッグ と 一時的な コード を 削除します。
ロジック を バイパス したり、 デバッグ 情報 を
出力 したり、 デバッグ の ために 実行 を
停止 したりする コード は、 開発中に誤って残された可能性が高いです。
対応言語: 45+はじめに
コードのデバッグ、 console.log() ステートメント、コメントアウトされたロジック、ハードコードされたテスト値、または デバッガー ブレークポイントは、ほとんどのチームが認めるよりも頻繁に本番環境にデプロイされます。これらのアーティファクトは、内部アプリケーションの状態を露呈させ、パフォーマンスのオーバーヘッドを生み出し、開発中にコードベースのどの部分に問題があったかを攻撃者に示唆します。トラブルシューティングのための一時的なコードとして始まったものは、デプロイ前に削除されないと永続的なセキュリティリスクとなります。
なぜ重要なのか
セキュリティへの影響: 本番環境のデバッグコードは、ユーザー認証情報、APIキー、PII(個人識別情報)など、本番ログに記録されるべきではない機密データをしばしばログに記録します。
A console.log(user) ステートメントは、セッショントークンを含むユーザーオブジェクト全体を、サポートスタッフやログ集約ツールがアクセスできるブラウザのコンソールまたはサーバーログにダンプする可能性があります。これは、自動コードレビューツールが検出する最も一般的なコードセキュリティ脆弱性の1つです。
パフォーマンスへの影響: 過剰なコンソールロギングはI/Oボトルネックを引き起こします。トラフィックの多いエンドポイントでリクエストペイロードをログに記録すると、リクエストごとに応答時間が15~30ミリ秒低下し、ログストレージコストが増大する可能性があります。Node.jsのプロダクション環境におけるロギングのパフォーマンスへの影響は、規模が大きくなるにつれて急速に増大します。
コードの保守性: 一時的なコードのコミット例: if (true) return; または
// TODO: fix later ビジネスロジックを迂回し、将来のメンテナーに混乱をもたらします。これらはドキュメントの痕跡がない技術的負債を表します。
攻撃対象領域の拡大: デバッガーステートメントや詳細なエラーログは、スタックトレース、ファイルパス、依存関係のバージョン、内部ロジックフローを露呈させ、標的型攻撃における偵察に有用な情報となります。
コード例
❌ 非準拠:
async function processPayment(userId, amount) {
console.log('Processing payment:', { userId, amount });
const user = await db.users.findById(userId);
console.log('User data:', user); // Logs email, tokens, everything
debugger;
const result = await paymentGateway.charge({
userId: user.id,
amount: amount
});
console.log('Gateway response:', result);
return result;
}
安全でない理由:コンソールステートメントは、PII(個人識別情報)や認証トークンを本番ログに記録します。コメントアウトされたデバッガーは、実行パスに関する曖昧さを生じさせます。これらのデータはすべてログアクセス権を持つ誰でもアクセス可能であり、攻撃者に偵察データを提供します。
✅ 準拠済み:
async function processPayment(userId, amount) {
const user = await db.users.findById(userId);
if (!user) {
throw new PaymentError('User not found');
}
const result = await paymentGateway.charge({
userId: user.id,
amount: amount
});
await auditLog.record({
event: 'PAYMENT_PROCESSED',
userId: userId,
transactionId: result.transactionId
});
return result;
}これが安全である理由: 構造化ロギングは console.log 機密性の高いユーザーデータを公開することなくビジネスイベントをキャプチャする適切な監査証跡を備えています。デバッグステートメントは存在しません。ロジックは条件付きバイパスなしで直線的に流れます。監査ログは一元化され、アクセス制御されており、コンプライアンスとデバッグに必要なコンテキストのみを含みます。
まとめ
本番環境のデバッグコードは、些細な問題ではなく、セキュリティ上の脆弱性、パフォーマンス上の負債、そしてメンテナンスの負担となります。安全なコードレビューのベストプラクティスに従うことは、これらの問題がメインブランチに到達する前に発見することを意味します。自動化されたコード品質ルールは、デバッグコードがバージョン管理、ましてや本番環境に到達するのを防ぐべきです。重要なのは、これらの問題がマージされる前に発見するための適切なツールを備えていることです。

