6.9. フェイル・セーフ

安全が必要なプログラムは、いつも「フェイル・セーフ」にしてください。つまり、 プログラムが正しく動作しなくなっても、一番安全な結果に落ち着くように設計して ください。 セキュリティに敏感なプログラムは、何らかの間違った動作を検知したなら (異常な入力や「起こり得ない」状態になる等)、プログラムはすぐにサービスを拒否 し、要求を処理するのを止めてください。 「ユーザが意図することを探り出そう」等は、しないでください。ただサービス を拒否してください。 こうすると、時として信頼性や使い勝手が悪くなるかもしれません(ユーザの立場 からすると)。しかし安全性は高まります。 わずかですがこうしたくない場合もあります(たとえば、サービス拒否が守秘義務 や保全性を失うよりも悪いケース)。しかしそれは非常にまれです。

私は「いっしょくたに機能しなくなる」ではなく、「その要求の処理を止める」こと を推奨している点に注意してください。 特に、大部分のサーバは、悪意ある入力があっても完全に停止すべきではありません。 完全に停止してしまうと、ちょっとしたことでサービス拒否攻撃が可能になるから です(攻撃者は不要なビットを送るだけで、サービスを使えなくしてしまいます)。 サーバ全体を落とす必要がでてくる場合もあります。特に「そうはならない」状態 は、問題が発生する兆候なので、とりあえず継続し続けるのは賢い方法とは言えません。

不成功を検知した場合は、返って来るエラーメッセージを何にするかを慎重に検討 してください。 何も返してこないと問題を診断するのが困難になりますし、逆に、過剰な情報は攻撃者 を結果的に助けることになるかもしれません。 一般に適切なのは、「access denied」や「miscellaneous error encountered」 を返して、より詳細な情報を監査ログ(その情報を見る人をコントロールできる場所 にある)に書く方法です。