デフォルトはあなたを沈没させる
TL;DR: 不明な応答は有効なものとしてではなく、不正なものとして扱います。
問題点
- セキュリティリスク
- 未知のケースを無視する
- エラー 誤解
- 有効な状態をデフォルトにする
- 不一致の承認
- イベントのログに失敗
- 悪用される可能性
ソリューション
- すべての応答を既知のコードのクローズド セットに対して検証します。
- デフォルト(および不明)を無許可にするか、デフォルトを削除します。
- 分析のために、不一致または予期しないケースをすべて記録します。
- エッジシナリオでテストします。
- コードが古くなるのを避けるために、応答プールをプロセッサと定期的に同期します。
- セキュリティに重点を置き、シフトレフトのプロセスにします。
- 変化するシナリオに対応できるよう、変更耐性を備えたシステムを設計します。
コンテクスト
今日はコンピュータセキュリティの日であり、すべてのプログラマーは自分の責任を認識する必要があります。
トランザクションを処理するためにクレジットカードプロセッサからの応答プールに依存する販売を処理するアプリケーションを想像してください。
各クレジットカードプロセッサは、残高不足やカードの有効期限切れなど、さまざまな状況に対して事前定義された応答コードを提供します。
この問題は、プロセッサが拒否されたトランザクションに対して新しい応答コードを追加したが、プラットフォームに通知しなかった場合に発生します。
アプリケーションは新しいコードを認識せず、デフォルトで「見つからない」として扱い、購入を承認します。
ユーザーはこの欠陥に気づき、それを悪用して不正な購入を行います。
プラットフォームの収益が急落し、破産に至った。
サンプルコード
間違っている
String response = paymentProcessor.authorize(cardDetails); switch (response) { case "DECLINED_INSUFFICIENT_FUNDS": // Handle insufficient funds break; case "DECLINED_EXPIRED_CARD": // Handle expired card break; default: // Authorize purchase break; }
右
String response = paymentProcessor.authorize(cardDetails); switch (response) { case "APPROVED": // Authorize purchase break; case "DECLINED_INSUFFICIENT_FUNDS": // Handle insufficient funds break; case "DECLINED_EXPIRED_CARD": // Handle expired card break; case "DECLINED_NEW_REASON": // Handle new declined reason break; default: // Reject purchase (default case for unknown responses) break; }
検出
- [x]マニュアル
エラー処理ロジックを確認することで、この臭いを検出できます。
システムが認識されないケースをログに記録して拒否するかどうかを確認します。
自動テストは、新しい入力や予期しない入力がデフォルトで有効なアクションに設定されるかどうかを識別するのに役立ちます。
静的解析ツールは、潜在的に不完全なエラー処理にフラグを立てることで役立ちます。
タグ
- 安全
レベル
- [x]中級
なぜ一対一対応が重要なのか
アプリケーションの支払いプロセッサ応答の内部表現とプロセッサによって返される実際のコードとの間に 1 対 1 の対応を維持することが重要です。
全単射を破ると、不一致が生じます。
アプリケーションが不明なコードを誤って解釈すると、予期しない動作、セキュリティ ホールが発生し、ビジネスに壊滅的な影響を与える可能性があります。
AI生成
未知のケースの処理方法を指定しないと、AI ツールがこの臭いを生み出す可能性があります。
たとえば、一般的なエラー処理では、デフォルトで「見つかりません」や「成功」などの無害な結果が返される場合があります。
AI検出
AI ジェネレーターは、不明なケースを不正なケースとして扱い、予期しないシナリオのログ記録とテストを重視するように指示すると、この臭いを修正できます。
ぜひお試しください!
覚えておいてください:AIアシスタントは多くの間違いを犯します
適切な指示がなければ | 具体的な指示 |
---|---|
結論
未知のケースは常に慎重に扱ってください。
「見つかりません」などのデフォルトは、重大なセキュリティ問題や経済的損失につながる可能性があります。
ログ記録と不明な応答の拒否を開発プラクティスの一部に組み込みます。
プログラミング中にセキュリティに関連するシフトレフトの決定を行います。
関係
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxii
https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-viii-8mn3352
免責事項
コードスメルは私の意見です。
クレジット
UnsplashのNathana Rebouçasによる写真
https://www.youtube.com/watch?v=J2QOejhA6ek
仮定はすべての失敗の元です。
サイード・ウイサル
この記事は CodeSmell シリーズの一部です。