C++ 应用程序安全:十大常见漏洞实战解析

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++ 应用程序安全:十大常见漏洞实战解析



C++ 是一门强大且高性能的语言,但其灵活性要求开发者具备高度的责任感。在内存管理、线程操作或输入输出方面的错误可能导致严重漏洞。本文将结合实际代码示例,解析 C++ 十大常见漏洞,并提供相应的防范方法。无论您是初学者还是经验丰富的开发者,本文都将帮助您增强项目的安全性。



1. 缓冲区溢出 (Buffer Overflow)

这是一种经典漏洞,当数据写入超出已分配数组边界时发生。在 C++ 中,使用原始数组和 C 语言函数时尤其危险。



#include <iostream>#include <cstring>

void vulnerable(char* input) { char buffer[10]; strcpy(buffer, input); // 危险:未检查长度 std::cout << "Buffer: " << buffer << std::endl;}

int main() { char longInput[] = "AAAAAAAABBBBBBBBCCCCCCCC"; // 24 个字符 vulnerable(longInput); return 0;}


解决方案: 使用 std::string 或带有显式长度检查的 strncpy。在现代 C++ 中,推荐使用 STL 容器。



void safe(const std::string& input) {    std::string buffer = input.substr(0, 9);  // 安全复制    std::cout << "Buffer: " << buffer << std::endl;}


2. 内存泄漏 (Memory Leaks)

当动态分配的内存未被释放时,就会发生内存泄漏。在长时间运行的应用程序中,这会导致资源耗尽。



void leakExample() {    int* data = new int[1000];  // 分配内存    // ... 处理数据 ...    // 忘记 delete[] data; — 内存泄漏!}


解决方案: 使用智能指针(std::unique_ptr、std::shared_ptr)或 STL 容器。



void safeExample() {    std::unique_ptr<int[]> data = std::make_unique<int[]>(1000);    // 函数退出时内存自动释放}


3. 空指针解引用 (Null Pointer Dereference)

尝试访问 nullptr 地址处的内存会导致未定义行为,通常会导致程序崩溃。



void process(int* ptr) {    *ptr = 42;  // 危险:如果 ptr == nullptr}

int main() { int* p = nullptr; process(p); // 崩溃}


解决方案: 使用指针前务必进行检查。如果值不可能为空,请使用引用。



void safeProcess(int* ptr) {    if (ptr == nullptr) {        throw std::invalid_argument("收到空指针");    }    *ptr = 42;}


4. 竞态条件 (Race Condition)

当多个线程同时访问共享数据且未进行同步时,就会发生竞态条件。



#include <thread>int counter = 0;

void increment() { for (int i = 0; i < 100000; ++i) { counter++; // 非原子操作 — 竞态条件 }}

int main() { std::thread t1(increment); std::thread t2(increment); t1.join(); t2.join(); std::cout << "Counter: " << counter; // 结果不可预测}


解决方案: 使用互斥锁或原子操作。



#include <atomic>std::atomic<int> counter{0};

void safeIncrement() { for (int i = 0; i < 100000; ++i) { counter.fetch_add(1); // 原子操作 }}


5. 使用未初始化的变量

未初始化的变量包含“垃圾值”,可能导致不可预测的行为。



int main() {    in                

博客

书籍推荐