Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Lỗ hổng Format String và phòng tránh trong C

Format String là gì?

Chuỗi định dạng (format string) là chuỗi ASCII chứa văn bản và các chỉ định định dạng (ví dụ %d, %s) dùng trong printf, sprintf...

Lỗ hổng Format String

Xảy ra khi dữ liệu đầu vào của người dùng được truyền trực tiếp làm format string cho các hàm xuất (printf, fprintf...). Kẻ tấn công có thể dùng các chỉ định như %n, %x, %s để đọc/ghi bộ nhớ tùy ý.

Ví dụ lỗ hổng

#include 
#include 
int main() {
    char buffer[100];
    strncpy(buffer, "Hi ", 5);
    printf(buffer); // nguy hiểm nếu buffer chứa %n, %x...
    return 0;
}

Phòng tránh

  • Luôn dùng format string tĩnh: printf("%s", buffer); thay vì printf(buffer);.
  • Sử dụng hằng số cho format string, tách biến làm tham số.
  • Bật cảnh báo compiler: -Wformat -Wformat-security (GCC/Clang).
  • Sử dụng các hàm an toàn hơn (snprintf, vsnprintf).