一个安全的程序应该始终 “故障安全”,也就是说,它的设计应该确保,如果程序确实发生故障,也应该产生最安全的结果。 对于安全关键型程序,这通常意味着,如果检测到某种形式的不当行为(输入格式错误、达到“不应该到达这里”的状态等等),程序应立即拒绝服务并停止处理该请求。 不要试图“弄清楚用户想要什么”:直接拒绝服务。 有时这可能会降低可靠性或可用性(从用户的角度来看),但会提高安全性。 在少数情况下,这可能不是理想的(例如,拒绝服务比机密性或完整性损失更糟糕),但这种情况非常罕见。
请注意,我建议 “停止处理请求”,而不是 “完全失败”。 特别是,大多数服务器在收到格式错误的输入时,不应完全停止,因为这会为拒绝服务攻击创造一个轻易的机会(攻击者只需发送垃圾位即可阻止您使用该服务)。 有时,完全关闭服务器是必要的,特别是,达到某些 “不应该到达这里” 的状态可能预示着问题非常严重,以至于继续运行是不明智的。
仔细考虑在检测到故障时发送回什么错误消息。 如果您不发送任何消息,则可能难以诊断问题,但是发送回太多信息可能会无意中帮助攻击者。 通常,最好的方法是回复 “拒绝访问” 或 “遇到其他错误”,然后将更详细的信息写入审计日志(您可以在其中更好地控制谁可以看到该信息)。