Security by design in practiceMany things, especially input, should be distrusted by a secure design. A fault-tolerant program could even distrust its own internals. Two examples of insecure design are allowing buffer overflows and format string vulnerabilities. The following C program demonstrates these flaws: int main() { char buffer100; printf("What is your name?\n"); gets(buffer); printf("Hello, "); printf(buffer); printf("!\n"); return 0; } Because the gets function in the C standard library does not stop writing bytes into The second flaw is that the program tries to print its input by passing it directly to the A related mistake in Web programming is for an online script not to validate its parameters. For example, consider a script that fetches an article by taking a filename, which is then read by the script and parsed. Such a script might use the following hypothetical URL to retrieve an article about dog food: http://www.example.net/cgi-bin/article.sh?name=dogfood.html If the script has no input checking, instead trusting that the filename is always valid, a malicious user could forge a URL to retrieve configuration files from the webserver: http://www.example.net/cgi-bin/article.sh?name=../../../../../etc/passwd Depending on the script, this may expose the /etc/passwd file, which on Unix-like systems contains (among others) user IDs, their login names, home directory paths and shells. (See SQL injection for a similar attack.) Server/client architecturesIn server/client architectures, the program at the other side may not be an authorised client and the client's server may not be an authorised server. Even when they are, a man-in-the-middle attack could compromise communications. Often the easiest way to break the security of a client/server system is not to go head on to the security mechanisms but instead to go around them. A man in the middle attack is a simple example of this, because you can use it to collect details to impersonate a user. Which is why it is important to consider encryption, hashing, and other security mechanisms in your design to ensure that information collected from a potential attacker wont allow access. Another key feature to client server security in design is not only the obvious. But just general good coding practices. For example following a known software design structure such as client and broker can help in designing a well built structure with a solid foundation. Further more that if the software is modified in the future it is even more important that it follows a logical foundation of separation between the client and server. This is because if a programmer comes in and can not clearly understand the dynamics of the program they may end up adding or changing something that can add a security flaw. Even with the best design this is always a possibility, but the better we standardize the design the least chance we have of this occurring. It is also important to ensure that the data passed between the client and server is necessary. A lazy programmer may use some simple functions from a server program just so the implementation does not have to be reproduced on the client. Though there are situations where this may be needed, excess data flow like this can have many disadvantages. One of which is making your connection more obvious, showing more details about the structure of communication, and possibly details that could expose a vulnerability. See also
External links
| |