We Can't Do It All
There are plenty of things that people may find to criticize about
this book. It's too broad a topic to make a perfect
book (that's the motivation for the web site,
actually). Although we believe that this book is likely to help you a
great deal, we do want to address some specific issues so at least
you'll know what you're getting if
you buy this book:
- This book is implementation-focused.
-
You're not likely to build secure software if you
don't know how to design software to be secure from
the get-go. We know that well, and we discuss it at great length in
the book Building Secure Software. On the other
hand, it's at least as easy to have a good design
that results in an insecure implementation, particularly when C is
the programming language you're using. Not only do
our implementation-level solutions incorporate good design
principles, but we also discuss plenty of issues that will affect
your designs as well as your implementations. The world needs to know
both how to design and how to implement with security in mind. We
focus on the implementation so that you'll do a
better job of it. Nonetheless, we certainly recommend that you read a
book that thoroughly covers design before you read this book.
- This book doesn't cover C++ well enough.
-
C++ programmers may grumble that we don't use any
C++ specific idioms. For the most part, the advice we give applies to
both languages, but giving all the examples in C makes them more
applicable, because practitioners in both languages can still use
them. On the rare occasion that there are things to note that are
specific to C++, we certainly try to do so; examples include our
discussions of buffer overflows and the use of exception handling to
prevent leaving programs in an insecure state. Over time, our
coverage of C++ will improve on the book's web site,
but, until then, C++ programmers should still find this book
relevant.
- This book doesn't always force you to do the secure thing.
-
Some people would rather we take the approach of showing you one
right way to do the few things you should be doing in your
applications. For example, we could simply cover ways to create a
secure channel, instead of talking about all the different low-level
cryptographic primitives and the many ways to use them. We do provide
a lot of high-level solutions that we'd strongly
prefer you use. On the other hand, we have consulted on so many
real-world systems that we know all too well that some people need to
trade off the absolute best security possible for some other
requirement. The whole security game is about risk mitigation, and
it's up to you to decide what your acceptable levels
of risk are. We have tried to accommodate people who may have
nonstandard requirements, and to teach those people the risks
involved in what they're doing. If we simply provide
high-level solutions, many people won't use them,
and will continue to build their own ad hoc
solutions without adequate guidance.
- This book could be friendlier to Windows developers.
-
In general, we cover the native Win32 API, rather than the variety of
other API sets that Microsoft offers, such as ATL and MFC. It would
simply be infeasible to cover all of them, so we've
opted to cover the one that everything else builds on.
We're sorry if you have to go to a lower-level API
than you might like if you want to use our code, but at least this
way the recipes are more widely applicable.
Much of the code that we present in the book will work on both Unix
and Windows with little or no modification. In these cases,
we've favored traditional Unix naming conventions.
The naming conventions may feel foreign, but the bottom line is that
no matter what platform you're writing code for,
naming conventions are a matter of personal preference.
If you thumb through the table of contents, you'll
quickly find that this book contains a considerable amount of
material relating to cryptography. Where it was reasonable to do so,
we've covered CryptoAPI for Windows, but on the
whole, OpenSSL gets far better coverage. It is our experience that
CryptoAPI is not nearly as full-featured as OpenSSL in many respects.
Further, some of the built-in Windows APIs for things such as SSL are
far more complex than we felt was reasonable to cover. Security is
something that is difficult to get right even with a good API to work
with; an overly complex and underdocumented API certainly
doesn't help the situation.
We've tried our best to give Unix and Windows
equivalent coverage. However, for some topic areas, one platform may
receive more in-depth attention. Generally, this is because of a
specific strength or weakness in the platform. We do believe both
Windows and Unix programmers can benefit from the material contained
in this book.
- There will still be security problems in code despite this book.
-
We have done our best to give you the tools you need to make your
code a lot better. But even security gurus occasionally manage to
write code with much bigger risks than anticipated. You should expect
that it may happen to you, too, no matter what you know about
security. One caveat: you should not use the code in this book as if
it were a code library you can simply link against. You really need
to read the text and understand the problems our code is built to
avoid to make sure that you actually use our code in the way it was
intended. This is no different from any other API, where you really
should RTFM thoroughly before coding if you want to have a chance of
getting things right.
Despite the shortcomings some readers may find, we think this book
has a great deal to offer. In addition, we will do the best job we
can to supplement this book on the Web in hopes of making the
material even better.
|