Разрешает ли <cffile> "запись" файл выполнять перед переименованием / записью файла?
Я создал загрузку файлов для своего клиента и стараюсь сделать их максимально безопасными. Я использую следующий код для обработки загрузки файла. Идея состоит в том, чтобы переименовать файл и записать его в папку вне корневого веб-каталога.
Вопрос в том, есть ли вероятность, что ColdFusion разрешит выполнение вредоносного файла до того, как файл будет записан в папку и переименован со следующим кодом, во время процесса записи?
Это наверху моего компонента...
<cfset destdir = "/folder/upload/">
Это часть кода, который обрабатывает файл...
<cfset var local = structNew()>
<cfset local.response = structNew()>
<cfset local.response['catcher'] = ''>
<cfset local.filename = listGetAt(#arguments.file#, 1, ".")>
<cfset local.fileext = ListLast(#arguments.file#, ".")>
<cfset local.nfile = #CreateUUID()# & "." & #local.fileext#>
<cftry>
<cffile action="write" file="#destdir##local.nfile#" output="#arguments.content#">
<cfset local.response['newfilename'] = local.nfile>
<cfcatch type="any">
<cfset local.response['catcher'] = "Write Exception " & #cfcatch.Detail# & " | " & #cfcatch.Message#>
<cfset local.response['success'] = true>
<cfreturn local.response>
</cfcatch>
</cftry>
Я должен упомянуть, что процедура загрузки файла обрабатывается CFC и плагином Valjs AjaxUpload...
3 ответа
Чтобы ответить на вопрос, который вы задали - ваша операция "запись" - это одна операция. Вы не перемещаете и не переименовываете оригинальный файл (по крайней мере, в коде выше). Вместо этого вы создаете дескриптор файла, выводите буфер и закрываете дескриптор. Код не может быть выполнен до освобождения дескриптора. Если вы перемещаете и переименовываете или копируете сам файл, то, как вы опасаетесь, может быть пробел, достаточный для выполнения. Вы также должны знать, что файловый ввод-вывод может создать проблемы, если вы намереваетесь записать, а затем выполнить файл в одном потоке запросов (может возникнуть ошибка при попытке получить доступ к файлу, так как Java может немного опередить ОС при получении уведомления ручку отпусти если видишь что я говорю).
Вот пост о взломе cffile, который может пролить свет на границы вашей проблемы.
http://www.coldfusionmuse.com/index.cfm/2009/9/18/script.insertion.attack.vector
Обратите внимание - это мое понимание... довольно солидное, но в этом списке есть несколько довольно умных людей, включая тех, кто уже ответил. Не пытаться украсть чей-то гром здесь.
Ваш пример кода выглядит так, как будто вы делаете что-то отличное от обычной загрузки файла. У вас нет действия cffile ="upload", и похоже, что вы уже получили содержимое файла. Вы должны ограничивать local.fileext
к типам файлов, которые вы считаете безопасными и Arguments.content
должны быть проверены, чтобы убедиться, что это не вредоносно. Как только вы записали файл в webroot, его можно проверить через URL, поэтому вы должны убедиться, что все безопасно, прежде чем писать его.
При обычной загрузке файла пост-формы процесс должен выглядеть примерно так:
- использование
cffile action="upload"
записать загрузку файла во временную папку вне webroot - Проверьте целостность файла, чтобы убедиться, что он не является вредоносным (удалите, если файл поврежден)
- Переместите проверенный файл в его окончательное местоположение с помощью
cffile action="move"
Хорошей идеей будет переименование файла при загрузке и размещение вне веб-корня, но есть еще несколько основных моментов, которые помогут улучшить безопасность при загрузке файлов в Coldfusion.
Для начала у cffile с действием upload есть атрибут "accept", в котором вы можете указать, какие типы mime (список с разделителями-запятыми) будет разрешен для загрузки вашего файла.
У cffile также есть атрибут "mode" (только для linux) для установки прав доступа к файлу.
источник: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_f_02.html
Я не думаю, что загруженный вредоносный файл может быть выполнен автоматически, когда он загружен так просто, но это хорошая практика, чтобы принять меры предосторожности.