6.7. 고장 안전

보안적인 프로그램은 오류가 발생하였을 때 그것을 한 부분에 국한시켜 전체 시스템이 완전히 마비되는 것을 방지하고 수행을 계속할 수 있도록 설계되어야 한다, 즉 프로그램이 실패하더라도 가장 안전한 결과가 나올 수 있도록 설계되어야 한다. 보안이 결정적인 프로그램의 경우 이는 어떤 종류의 오작동이 탐지된다면 ("can't get here" 상태에 도달하는 기형의 입력 등) 프로그램이 즉각적으로 서비스를 거절하고 그 요청 처리를 중지해야 한다. 사용자가 무엇을 원했는지 이해하려고 하지 마라; 그저 서비스를 거절해라. 때때로 이는 사용자 관점에서 신뢰성 또는 사용성을 감소시키지만 보안은 증가시킨다. 이것이 바람직하지 않은 약간의 경우도 있지만 (예, 서비스 부인이 기밀성 또는 무결성 손실보다 더욱 나쁜 경우가 있다) 거의 드문 경우이다.

저자가 ``전체적으로 실패해라" 가 아닌 ``요청 처리를 중지하라"는 것에 주목해라. 특히 대부분의 서버는 기형의 입력을 받을 때 완전히 멈춰서는 안되는데 이런 경우 서비스 부인 공격 (공격자가 서비스 사용을 방해하기 위해 그저 가비지 비트를 보낸다) 에 대한 사소한 기회를 제공하기 때문이다. 때때로 전체 서버를 다운시키는 것이 필요한데 특히 "can't get here" 상태에 이르는 것은 계속하는 것이 어리석을 만큼 격렬한 문제임을 알리는 것일 수도 있다.

실패가 탐지될 때 어떤 에러 메시지를 보여줄지를 주의깊게 고려해라. 아무것도 보여주지 못한다면 문제를 진단하는 것은 어렵지만 너무 많은 정보를 보여준다면 무심결에 공격자를 도울 수 있다. 보통 최선의 접근 방법은 "접근 거절 (access denied)" 또는 "기타 에러 생성 (miscellaneous error encountered)" 으로 응답한 후 더욱 세부적인 정보를 감사 로그 (누가 정보를 보는 지에 대해 더욱 많은 제어를 할 수 있다) 에 기록하는 것이다.