C/C++ Secure Coding

Secure coding practices for C/C++ applications.


Buffer Overflow Prevention

1// ❌ Vulnerable
2char buffer[100];
3gets(buffer);  // Never use!
4sprintf(buffer, "%s", user_input);
5
6// ✅ Secure
7char buffer[100];
8fgets(buffer, sizeof(buffer), stdin);
9snprintf(buffer, sizeof(buffer), "%s", user_input);

Integer Overflow

 1// ❌ Vulnerable
 2size_t size = user_size;
 3char* buffer = malloc(size);
 4
 5// ✅ Secure
 6size_t size = user_size;
 7if (size > MAX_ALLOWED_SIZE || size == 0) {
 8    return ERROR;
 9}
10char* buffer = malloc(size);
11if (!buffer) {
12    return ERROR;
13}

Format String Vulnerability

1// ❌ Vulnerable
2printf(user_input);  // Dangerous!
3
4// ✅ Secure
5printf("%s", user_input);

SQL Injection (C++)

1// ❌ Vulnerable
2std::string query = "SELECT * FROM users WHERE username = '" + username + "'";
3mysql_query(conn, query.c_str());
4
5// ✅ Secure: Prepared statements
6MYSQL_STMT* stmt = mysql_stmt_init(conn);
7const char* query = "SELECT * FROM users WHERE username = ?";
8mysql_stmt_prepare(stmt, query, strlen(query));
9mysql_stmt_bind_param(stmt, bind);

Command Injection

 1// ❌ Vulnerable
 2char cmd[256];
 3sprintf(cmd, "cat %s", filename);
 4system(cmd);
 5
 6// ✅ Secure
 7if (!is_valid_filename(filename)) {
 8    return ERROR;
 9}
10char* args[] = {"cat", filename, NULL};
11execvp(args[0], args);

Use After Free Prevention

1// ❌ Vulnerable
2delete ptr;
3// ... later ...
4ptr->method();  // Use after free
5
6// ✅ Secure: Smart pointers
7auto ptr = std::make_unique<Object>();
8// Can't use after scope ends

Related Snippets