Defensive Programming

Defensive programming is a form of defensive design intended to ensure the continuing function of a piece of software in spite of unforeseeable usage of said software. The idea can be viewed as reducing or eliminating the prospect of Murphy's Law having effect. Defensive programming techniques come into their own when a piece of software could be misused mischievously or inadvertently to catastrophic effect. Here are some hints on defensive programming techniques to avoid creating security problems. Many of these techniques also improve general quality of code, because almost any major bug can be potentially used by a cracker for a denial-of-service attack or other attack. Note that the techniques below are not sufficient to ensure security: see the articles computer insecurity and secure computing for more information.
  • One of the most common problems is unchecked use of constant-size structures and functions for dynamic-size data (the buffer overflow problem). This is especially common for string data in C. C library functions like gets and scanf should never be used since the maximum size of the input buffer is not passed as an argument.
  • Never make code more complex than necessary. Complexity breeds bugs, including security problems.
  • Either leave the code available to everyone on the Net (see Free software or Open Source Definition) or hire someone who will perform a software security audit.
  • If possible, reuse code instead of writing from scratch.
  • Encrypt all important data transmitted over networks.
  • All data is important until proven otherwise.
  • All code is insecure until proven otherwise.
  • Never make programs setuid unless you're really sure it's secure.
  • If data is checked for correctness, verify if it's correct, not if it is incorrect.
Crackers are likely to invent new kinds of incorrect data. For example, if you checked if a requested file is not "/etc/passwd", a cracker might pass another name of this file, like "/etc/../etc/passwd".
Preconditions, postconditions and invariants validation are also part of defensive programming. This may involve checking arguments to a function or method for validity before execution of the body of the function. After the body of a function, doing a check of object state (in OO languages) or other held data and the return value before exits (break/return/throw/error code) is also wise. Within functions, you may want to double check that you are not referencing something that is not valid (i.e., null) and that array lengths are valid before referencing elements with indexes on all temporary/local instantiations. A good heuristic is to not trust the libraries you did not write either. So any time you call them, check what you get back from them. It often helps to create a small library of "asserting" and "checking" functions to do this along with a logger so you can trace your path and reduce the need for extensive debugging cycles in the first place. With the advent of logging libraries and aspect oriented programming, many of the tedious aspects (yes, a pun) of defensive programming are mitigated. Generally speaking then, it is preferrable to throw intelligible exception messages that enforce part of your API contract and guide the client programmer instead of returning values that a client programmer is likely to be unprepared for and hence minimize their complaints and increase robustness and security of your software.
Books:
  • William R. Cheswick and Steven M. Bellovin, Firewalls and Internet Security: Repelling the Wily Hacker ISBN 0201633574 http://www.wilyhacker.com/
External references:

 

<< PreviousWord BrowserNext >>
jasper (disambiguation)
pyrrolysine
hortense de beauharnais
calvados
pdf
josphine de beauharnais
eugne de beauharnais
pippin
eye of sauron
lycoris
les invalides
shelob
343 bc
lidice
oradour sur glane
450 bc
vector field
bag end
forgent networks
risc pc
all's well that ends well
trabzon
the taming of the shrew
delmarva peninsula
333 bc
shevonne durkin
lee armstrong
grma
thoden
marie louise of austria
michelle pfeiffer
one ring
the ring
acadia national park
fellowship of the ring (characters)
world wrestling entertainment
napolon eugne, prince imperial
empress eugnie
abdul kalam
louisiana tech university
all this and heaven too
foreign correspondent
the great dictator
kitty foyle