Подтвердить что ты не робот

Предупреждение tmpnam о том, что это опасно

Я получаю это предупреждение, говоря, что tmpnam опасен, но я бы предпочел использовать его, поскольку он может использоваться как в Windows, так и в Linux. Мне было интересно, почему это будет считаться опасным (я предполагаю это из-за потенциального злоупотребления, а не на самом деле не работает должным образом).

4b9b3361

Ответ 1

Из tmpnam manpage:

Функция tmpnam() генерирует различную строку каждый раз, когда она вызывается, до TMP_MAX раз. Если он вызывается больше, чем TMP_MAX раз, поведение определяется реализацией.

Хотя tmpnam() генерирует имена, которые трудно угадать, тем не менее возможно, что между тем, когда tmpnam() возвращает имя пути и время открытия программы, другая программа может создать это имя пути, используя open (2) ) или создать его как символическую ссылку. Это может привести к дырам в безопасности. Чтобы избежать таких возможностей, используйте открытый (2) флаг O_EXCL, чтобы открыть путь. Или еще лучше, используйте mkstemp (3) или tmpfile (3).

Mktemp действительно создает файл, поэтому вы уверены, что он работает, тогда как tmpnam возвращает имя, возможно, уже существующее.

Ответ 2

Если вы хотите использовать один и тот же символ на нескольких платформах, используйте макрос для определения TMPNAM. Пока вы выбираете более безопасные функции с одним и тем же интерфейсом, вы сможете использовать их для обоих. У вас есть условная компиляция где-то в вашем коде, верно?

Ответ 3

Из справочной страницы tmpnam (3):

Хотя tmpnam() генерирует имена, которые трудно угадать, тем не менее возможно, что между временем что tmpnam() возвращает имя пути и время, когда программа открывает его, другая программа может создать этот путь - name, используя open (2), или создайте его как символическую ссылку. Это может привести к дырам в безопасности. Чтобы избежать таких, используйте открытый (2) флаг O_EXCL, чтобы открыть путь. Или еще лучше, используйте mkstemp (3) или tmpfile (3).

Ответ 4

если вы говорите о предупреждении компилятора MSVC:

 These functions are deprecated because more secure versions are available;
 see tmpnam_s, _wtmpnam_s.

(http://msdn.microsoft.com/de-de/library/hs3e7355(VS.80).aspx)

иначе просто прочитайте, что говорят manpages о недостатках этой функции. это в основном около 2-го процесса, создающего точно то же имя файла, что и ваш процесс.

Ответ 5

Функция опасна, потому что вы несете ответственность за выделение буфера, который будет достаточно большим для обработки строки, которую tmpnam() собирается записать в этот буфер. Если вы выделяете слишком маленький буфер, tmpnam() не может этого знать и будет перекрывать буфер (вызывая хаос). tmpnam_s() (MS secure version) требуется передать длину буфера, поэтому tmpnam_s знать, когда остановиться.