Почему делает MSVC ++, рассматривают “станд.:: strcat”, чтобы быть “небезопасным”? (C++)

SELECT color, COUNT(*) FROM t_table GROUP BY color
6
задан 1 June 2009 в 19:57
поделиться

7 ответов

Потому что в буфере, префиксе, может быть меньше места, чем вы копируете в него, что вызывает переполнение буфера. Следовательно, хакер может передать специально созданную строку, которая перезаписывает адрес возврата или другую критическую память, и начать выполнение кода в контексте вашей программы.

strcat_s решает эту проблему, вынуждая вас передать длину буфера, в который вы копируете строку; он обрежет строку, если необходимо, чтобы убедиться, что буфер не переполнен.

google strcat_s, чтобы точно узнать, как его использовать.

27
ответ дан 8 December 2019 в 02:00
поделиться

That's one of the string-manipulation functions in C/C++ that can lead to buffer overrun errors.

The problem is that the function doesn't know what the size of the buffers are. From the MSDN documentation:

The first argument, strDestination, must be large enough to hold the current strDestination and strSource combined and a closing '\0'; otherwise, a buffer overrun can occur.

strcat_s takes an extra argument telling it the size of the buffer. This allows it to validate the sizes before doing the concat, and will prevent overruns. See http://msdn.microsoft.com/en-us/library/d45bbxx4.aspx

4
ответ дан 8 December 2019 в 02:00
поделиться

Если вы используете c ++, почему бы не избежать всего беспорядка и не использовать std :: string . Тот же пример без ошибок будет выглядеть так:

std::string prefix = "Sector_Data\\sector";
prefix += "0";
prefix += "\\"

не нужно беспокоиться о размерах буфера и тому подобном. А если у вас есть API, который принимает const char * , вы можете просто использовать член .c_str () ;

some_c_api(prefix.c_str());
29
ответ дан 8 December 2019 в 02:00
поделиться

Чтобы отключить предупреждение, вы можете сделать следующее.

#pragma warning(disable:4996)

Кстати, я настоятельно рекомендую вам использовать strcat_s ().

4
ответ дан 8 December 2019 в 02:00
поделиться

Вы можете избавиться от этого предупреждения, добавив :

_CRT_SECURE_NO_WARNINGS

и

_SCL_SECURE_NO_WARNINGS

в определения препроцессора вашего проекта.

4
ответ дан 8 December 2019 в 02:00
поделиться

Because it has no means of checking to see if the destination string (prefix) in your case will be written past its bounds. strcat essentially works by looping, copying byte-by-byte the source string into the destination. Its stops when it sees a value "0" (notated by '\0') called a null terminal. Since C has no built in bounds checking, and the dest str is just a place in memory, strcat will continue going ad-infinidium even if it blows past the source str or the dest. str doesn't have a null terminal.

The solutions above are platform-specific to your windows environment. If you want something platform independent, you have to wrangle with strncat:

strncat(char* dest, const char* src, size_t count)

This is another option when used intelligently. You can use count to specify the max number of characters to copy. To do this, you have to figure out how much space is available in dest (how much you allocated - strlen(dest)) and pass that as count.

3
ответ дан 8 December 2019 в 02:00
поделиться

У strcat есть две проблемы. Во-первых, вы должны выполнить всю вашу проверку вне функции, выполняя работу, которая почти такая же, как и функция:

if(pDest+strlen(pDest)+strlen(pScr) < destSize)

Вы должны пройти по всей длине обеих строк, чтобы убедиться, что они подходят, прежде чем идти по их всю длину СНОВА, чтобы сделать копию. Из-за этого многие программисты просто предполагают, что он подойдет, и пропускают тест. Хуже того, может случиться так, что при первом написании кода он ГАРАНТИРУЕТСЯ, чтобы соответствовать, но когда кто-то добавляет еще один strcat или изменяет размер буфера или константу где-то еще в программе, теперь у вас возникают проблемы.

Другая проблема если pSrc и pDst перекрываются. В зависимости от вашего компилятора strcat может быть простым циклом, который проверяет символ за раз на наличие 0 в pSrc. Если pDst перезаписывает этот 0,

0
ответ дан 8 December 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: