Welcome back. In 1988, the Internet worm broke into a large number of computers on the ARPANET, the predecessors of today's Internet. One of the techniques they've used was to exploit the failure of a server to check the length of an incoming message, a classic buffer overflow. That was a programming error and it led directly to the compromise of a large number of systems. Had the server been written using secure programming techniques, that vulnerability would not have existed. This shows the importance of secure programming. In this module of Principles of Secure Programming, we will be laying the foundation for any secure programming project by delving into secure programming philosophy. We will define concepts such as secure programming, privilege and protection domain. We'll differentiate between robust versus secure programming, programs which do the job they were built for versus programs which conform security policies. Next, we'll examine security policies and procedures and discuss how they affect both security and robustness. The latter sections of this module will shed light on how to find and assess potential problems in your code. We will discuss tips and tricks for efficiently checking the design and implementation of your programs. Finally, we will discuss where to look for vulnerabilities in your programs. At the end of this lesson, you'll be able to describe key concepts in secure programming, including robust programming and typical problems in procedures, and generalize from philosophies of what to watch out for and where to look for specific situations. We have a lot of ground to cover so let's begin.