understanding the dangers of sprintf(…)

前端 未结 8 1436

OWASP says:

\"C library functions such as strcpy (), strcat (), sprintf () and vsprintf () operate on null terminated strings and perform no bou

相关标签:
8条回答
  • 2020-12-01 05:21

    You're correct on both problems, though they're really both the same problem (which is accessing data beyond the boundaries of an array).

    A solution to your first problem is to instead use std::snprintf, which accepts a buffer size as an argument.

    A solution to your second problem is to give a maximum length argument to snprintf. For example:

    char buffer[128];
    
    std::snprintf(buffer, sizeof(buffer), "This is a %.4s\n", "testGARBAGE DATA");
    
    // std::strcmp(buffer, "This is a test\n") == 0
    

    If you want to store the entire string (e.g. in the case sizeof(buffer) is too small), run snprintf twice:

    int length = std::snprintf(nullptr, 0, "This is a %.4s\n", "testGARBAGE DATA");
    
    ++length;           // +1 for null terminator
    char *buffer = new char[length];
    
    std::snprintf(buffer, length, "This is a %.4s\n", "testGARBAGE DATA");
    

    (You can probably fit this into a function using va or variadic templates.)

    0 讨论(0)
  • 2020-12-01 05:25

    Your 2 numbered conclusions are correct, but incomplete.

    There is an additional risk:

    char* format = 0;
    char buf[128];
    sprintf(buf, format, "hello");
    

    Here, format is not NULL-terminated. sprintf() doesn't check that either.

    0 讨论(0)
提交回复
热议问题