sprintf_s со слишком маленьким буфером

@Roo

, который я несколько согласовываю на то, что Вы говорите, но не являетесь им стоящий шифрования данные только для создания немного более трудным для кого-то получить его?

С Вашим обоснованием, было бы бесполезно иметь блокировки или предупреждения в Вашем доме, потому что они могут также легко быть скомпрометированы.

Мой ответ:

я сказал бы, что, если у Вас есть уязвимые данные, что Вы не хотите падать в неправильных руках, необходимо, вероятно, сделать это настолько трудно, как Вы можете для хакера для получения его, даже если это не на 100% надежно.

10
задан Steven smethurst 1 October 2009 в 20:58
поделиться

5 ответов

Вместо sprintf_s вы можете использовать snprintf (также известный как _snprintf в Windows).

#ifdef WIN32
#define snprintf _snprintf
#endif

char buffer[10];    
int length = snprintf( buffer, 10, "1234567890.1234567890." );
// unix snprintf returns length output would actually require;
// windows _snprintf returns actual output length if output fits, else negative
if (length >= sizeof(buffer) || length<0) 
{
    /* error handling */
}
5
ответ дан 3 December 2019 в 16:10
поделиться

Это задумано. Вся суть sprintf_s и других функций из семейства * _ s состоит в том, чтобы отлавливать ошибки переполнения буфера и обрабатывать их как нарушения предварительного условия . Это означает, что на самом деле они не подлежат восстановлению. Это предназначено только для обнаружения ошибок - вам никогда не следует вызывать sprintf_s , если вы знаете, что строка может быть слишком большой для целевого буфера. В этом случае сначала используйте strlen , чтобы проверить и решить, нужно ли вам обрезать.

16
ответ дан 3 December 2019 в 16:10
поделиться

Из MSDN:

Другое главное различие между sprintf_s и sprintf состоит в том, что sprintf_s принимает параметр длины, определяющий размер выходного буфера в символах. Если буфер слишком мал для печатаемого текста, тогда в буфере устанавливается пустая строка и вызывается обработчик недопустимого параметра. В отличие от snprintf, sprintf_s гарантирует, что буфер будет завершен нулем (если размер буфера не равен нулю).

Так что в идеале то, что вы написали, должно работать правильно.

0
ответ дан 3 December 2019 в 16:10
поделиться

Похоже, вы что-то пишете на MSVC?

Я думаю, что в документации MSDN для sprintf_s написано, что assert dies, поэтому я не уверен, что вы можете программно поймать это.

Как предположил Л.Бушкин, гораздо лучше использовать классы, управляющие строками.

0
ответ дан 3 December 2019 в 16:10
поделиться

См. Раздел 6.6.1 документа TR24731 , который является версией Комитета ISO C функциональности, реализованной Microsoft. Он предоставляет функции set_constraint_handler () , abort_constraint_handler () и ignore_constraint_handler () .

Есть комментарии Павла Минаева, предполагающие, что реализация Microsoft не поддерживает придерживаться предложения TR24731 (которое является «Техническим отчетом типа 2»), поэтому вы не сможете вмешаться или вам, возможно, придется сделать что-то отличное от того, что указано в TR. Для этого внимательно изучите MSDN.

0
ответ дан 3 December 2019 в 16:10
поделиться
Другие вопросы по тегам:

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