Временное расположение файла при использовании tmpfile() в C
$ man tmpfile говорит
Стандарт не указывает каталог, который будет использовать tmpfile(). Glibc попробует префикс пути P_tmpdir, определенный в , и если что не работает каталог /tmp.
Я использую Ubuntu 13.10 x86_64, gcc и libc BTW.
Поэтому, когда я пытаюсь создать временный файл, используя tmpfile(), я не вижу никакого временного файла в /tmp. (Я вижу # define P_tmpdir «/tmp» в stdio.h). Это фрагмент кода, который я использовал:
$ ./tmpfile
Теперь, когда scanf ожидает следующего (избыточного) ввода, я должен был увидеть временный файл в /tmp. Но я не могу. Итак, где именно создается этот tmpfile?
Вероятно, запись файла в каталоге удаляется напрямую. В системах POSIX сам файл остается действительным после удаления, если у вас есть дескриптор открытого файла. (В вашем случае скрыто в возвращаемом значении FILE* .)
С помощью этой технологии никто не может проникнуть и открыть этот файл, он доступен только через вашу переменную tmp .
Компиляция вашего кода и его запуск через strace показывает расположение и имя файла:
«/tmp/tmpfflAlKG» создается через open()
а затем сразу получает unlink()
поэтому видимая запись в каталоге исчезает.
Как все еще открыт для процесса, сам файл остается действительным для процесса до процесса close() . Последнее происходит неявно через вызов `exit_group():
Функция tmpfile
Функция tmpfile() открывает временный двоичный файл для операций чтения-записи и возвращает указатель на связанный с ним поток. Она автоматически использует уникальное имя файла, чтобы избежать конфликтов с существующими файлами.
Функция tmpfile() при неудачном выполнении возвращает нулевой указатель, а при успешном — указатель на поток.
Временный файл, созданный функцией tmpfile() , автоматически удаляется при закрытии файла или по завершении программы.
Количество временных файлов, которые можно открыть, равно значению TMP_MAX (которое не превышает предел, определяемый значением FOPEN_MAX ).
tmpfile — Создаёт временный файл
(PHP 4, PHP 5, PHP 7)
tmpfile — Создаёт временный файл
Описание
Создаёт временный файл с уникальным именем, открывая его в режиме чтения и записи (w+), и возвращает файловый указатель.
Этот файл автоматически удаляется после закрытия (например вызовом функции fclose() , или если не осталось ни одной ссылки на указатель файла, возвращаемый tmpfile() ), или при завершении работы скрипта.
Для дополнительной информации, обратитесь к документации вашей системы по функции tmpfile(3), а также к заголовочному файлу stdio.h .
Возвращаемые значения
Возвращает дескриптор файла, аналогичный тому, который возвращает функция fopen() для новых файлов или FALSE в случае возникновения ошибки.
Примеры
Пример #1 Пример использования функции tmpfile()
Результат выполнения данного примера:
Смотрите также
- tempnam() — Создаёт файл с уникальным именем
- sys_get_temp_dir() — Возвращает путь к директории временных файлов
Что такое код tmpfile
Класс для работы с временным файлом на PHP как альтернатива стандартной функции tmpfile() . Подробнее об устройстве класса написано на Хабре. В свой проект можно подключить через Composer:
Класс поддерживает стандартный набор CRUD-операций. Методы для записи и чтения являются обёртками для file_put_contents() и file_get_contents() . Для открытия временного файла в потоке используйте fopen() . Ниже приведены возможные варианты применения в боевых условиях:
Магический метод __toString() при declare(strict_types=1)
Начиная с версии 7.0, при указании строгой типизации declare(strict_types=1) , имя временного файла нельзя передать используя возможности __toString() , т. к. принимающая функция или класс ожидают строку, а по факту мы передаём объект. В таком случае будет брошено исключение TypeError. Это поведение можно обойти, если сразу передать имя временного файла через свойство объекта $tmpfile->filename :
Отслеживание открытых потоков fopen(new tmpfile, ‘r+’)
Класс new tmpfile не полностью повторяет функцию tmpfile() , т. к. при открытии потока fopen(new tmpfile, ‘r+’) временный файл блокируется и не будет автоматически удалён. Решить эту проблему можно, если самостоятельно отследить не закрытый поток временного файла по URI и закрыть его через fclose() :
Я не добавил этот код в метод $tmpfile->delete() в силу того, что удобнее сразу работать с tmpfile() для хранения временных данных в контексте решения локальных задач, где вся логика инкапсулирована в одном методе или классе. Автоматическое закрытие ресурса было бы избыточно, т. к. его можно и нужно отслеживать самостоятельно. Класс new tmpfile предназначен, всё же, для перемещения URI временного файла между объектами и дальнейшей работы с ним как с обычным файлом.
Тема: необходим доступ к функции tmpfile и tempnam
Опции темы
Поиск по теме
необходим доступ к функции tmpfile и tempnam
В связи с тем что для правильной работы некоторых скриптов необходим доступ к функции tmpfile и tempnam , нам необходимо иметь в конфиге апача по умолчанию такое изменение:
вместо php_admin_value open_basedir «/var/www/technoport/data:.» это должно выглядеть так php_admin_value open_basedir «/var/www/technoport/data:/tmp:.»
мы конечно можем править в ручную для вновь созданных доменов , но потребность и необходимость в том, бы чтобы по умолчанию панель добавляла темп папку в этот параметр
можете ли вы выпустить специально для нас небольшой патч, либо указать где можно исправить это самостоятельно.
Re: необходим доступ к функции tmpfile и tempnam
В связи с тем что для правильной работы некоторых скриптов необходим доступ к функции tmpfile и tempnam , нам необходимо иметь в конфиге апача по умолчанию такое изменение:
вместо php_admin_value open_basedir «/var/www/technoport/data:.» это должно выглядеть так php_admin_value open_basedir «/var/www/technoport/data:/tmp:.»
мы конечно можем править в ручную для вновь созданных доменов , но потребность и необходимость в том, бы чтобы по умолчанию панель добавляла темп папку в этот параметр
можете ли вы выпустить специально для нас небольшой патч, либо указать где можно исправить это самостоятельно.
в версии RPO можно редактировать конфиг апача, прямо из панели
Файл в папке temp
В данном разделе форума действуют дополнительные правила — тема «Общие правила раздела «Уничтожение вирусов»» . Пожалуйста, ознакомьтесь с ними перед размещением любого сообщения в данном разделе.
Для оформления запроса о помощи, внимательно прочитайте и аккуратно выполните указания в теме «Порядок оформления запроса о помощи» .
- Авторизуйтесь для ответа в теме
#1 OFF sven74
Прикрепленные файлы
- virusinfo_syscure.zip32,26К скачиваний 49
- virusinfo_syscheck.zip32,58К скачиваний 32
- info.txt46,82К скачиваний 64
- log.txt124,89К скачиваний 54
#2 OFF thyrex
Награды
Скорее всего временный файл какой-то из установленных программ
Пофиксите в HiJack
Microsoft MVP 2012-2020 Consumer Security
Microsoft MVP 2020 Reconnect
PHP получить путь к временному файлу из функции tmpfile
PHP функция tmpfile возвращает ресурс дескриптор на созданный временный файл. Я записываю в него данные, но мне нужно узнать его размер и другую информацию о файле, это можно сделать имея путь к файлу. Читать файл по кускам и считать количество прочитанный байт не очень удобно. Возможно ли получить путь к файлу созданному функции tmpfile?
Функцию tmpnam не предлагать, созданные файлы этой функцией, потом не удаляются и приходится делать это вручную. Если скрипт даст сбой, то файл не будет удален.
Функция stream_get_meta_data возвращает информацию из потока.
Да, функцию tmpnam лучше не использовать.
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
c — Что такое дыра безопасности в tmpfile и как tmpfile_s разрешает его?
Что такое дыра безопасности в tmpfile и как tmpfile_s разрешает его?
-
1 1
- 1 июл 2020 2020-07-01 12:39:56
- Mehrdad
1 ответ
В этом случае он, по-видимому, подпадает под категорию «Улучшенная отчетность об ошибках» обновлений для Windows CRT. В этом случае это в основном означает, что он вернет значение статуса и заполнит предопределенный указатель FILE , а не просто FILE указатель FILE .
Что такое код tmpfile
The standard does not specify the directory that tmpfile() will use.
Glibc will try the path prefix P_tmpdir defined in , and if
that fails the directory /tmp.
Я использую Ubuntu 13.10 x86_64, gcc и libc BTW.
Поэтому, когда я пытаюсь создать временный файл, используя tmpfile (), я не вижу никакого временного файла в / tmp. (Я вижу # define P_tmpdir «/ tmp» в stdio.h). Вот фрагмент кода, который я использовал:
$ ./tmpfile
Теперь, пока scanf ожидает следующего (избыточного) ввода, я должен был увидеть временный файл в / tmp. Но я не могу. Итак, где же создается этот tmpfile?
С этой техникой никто не может проникнуть и открыть этот файл, он доступен только через вашу переменную tmp.
tmpfile_s tmpfile_s
Создает временный файл. Creates a temporary file. Это версия функции tmpfile с усовершенствованиями системы безопасности, описанными в разделе Функции безопасности в CRT. It is a version of tmpfile with security enhancements as described in Security Features in the CRT.
Синтаксис Syntax
Параметры Parameters
пфилептр pFilePtr
Адрес указателя для хранения адреса созданного указателя на поток. The address of a pointer to store the address of the generated pointer to a stream.
Возвращаемое значение Return Value
Возвращает 0 в случае успеха или код ошибки в случае неудачи. Returns 0 if successful, an error code on failure.
Условия ошибок Error Conditions
пфилептр pFilePtr | Возвращаемое значение Return Value | Содержимое пфилептр Contents of pFilePtr |
---|---|---|
NULL NULL | EINVAL EINVAL | не изменено not changed |
Если возникает ошибка проверки приведенного выше параметра, вызывается обработчик недопустимого параметра, как описано в разделе Проверка параметров. If the above parameter validation error occurs, the invalid parameter handler is invoked, as described in Parameter Validation. Если выполнение может быть продолжено , для параметра еинвал устанавливается значение, а для возвращаемого значения — еинвал. If execution is allowed to continue, errno is set to EINVAL and the return value is EINVAL.
Примечания Remarks
Функция tmpfile_s создает временный файл и помещает указатель на этот поток в аргументе пфилептр . The tmpfile_s function creates a temporary file and puts a pointer to that stream in the pFilePtr argument. Временный файл создается в корневом каталоге. The temporary file is created in the root directory. Чтобы создать временный файл в каталоге, отличном от корневого, используйте tmpnam_s или tempnam в сочетании с fopen. To create a temporary file in a directory other than the root, use tmpnam_s or tempnam in conjunction with fopen.
Если файл не удается открыть, tmpfile_s записывает значение NULL в параметр пфилептр . If the file cannot be opened, tmpfile_s writes NULL to the pFilePtr parameter. Этот временный файл автоматически удаляется при закрытии файла, при завершении программы в обычном режиме или при вызове _rmtmp , предполагая, что текущий рабочий каталог не изменяется. This temporary file is automatically deleted when the file is closed, when the program terminates normally, or when _rmtmp is called, assuming that the current working directory does not change. Временный файл открывается в режиме w + b (двоичный для чтения и записи). The temporary file is opened in w+b (binary read/write) mode.
Сбой может произойти при попытке более TMP_MAX_S (см. stdio). H) вызывает метод с tmpfile_s. Failure can occur if you attempt more than TMP_MAX_S (see STDIO.H) calls with tmpfile_s.
Требования Requirements
Подпрограмма Routine | Обязательный заголовок Required header |
---|---|
tmpfile_s tmpfile_s |
Дополнительные сведения о совместимости см. в разделе Совместимость. For additional compatibility information, see Compatibility.
Пример Example
В этом примере для запуска в Windows могут потребоваться права администратора. This example may require administrative privileges to run on Windows.