Каков самый безопасный способ удаления папки и ее содержимого в ColdFusion?

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

До сих пор я использовал метод создания динамического пакетного файла следующим образом:

    <!--- check if folder exists before starting to delete --->
<cfif directoryexists("#file_path_course#")>

    <!--- this can be passed in a varaible or whatever ---> 
    <cfset tDirectory = "#file_path_course#"> 

    <!--- This is what we will put in the bat file ---> 
    <cfset tString ="RMDIR /S /Q " & tDirectory> 

    <!--- generate a .BAT file for later execution ---> 
    <cffile action="WRITE" file="#file_path_course#\delete.bat" output="#tString#">

    <!--- Now execute the file to delete everything (Folder and all sub-folders and files)---> 
    <cfexecute name="#file_path_course#\delete.bat" timeout="60"></cfexecute> 

    <!--- check if bat file exists --->
    <cfif fileexists("#file_path_course#\delete.bat")>

        <!--- now delete the bat file ---> 
        <cffile action="DELETE" file="#file_path_course#\delete.bat"> 

    </cfif>

    <!--- delete course folder --->
    <cfdirectory action="delete" directory="#file_path_course#" recurse="yes">

    <cfset course_files_deleted = "Yes">

</cfif>

Но я, по общему признанию, обеспокоен разрешенным использованием тега cfexecute.

Есть еще один вариант, который использует параметр рекурсивного удаления cfdirectory, который сделает все, что я прошу, но я хочу быть уверенным, что он не удалит папки/файлы за пределами папки, на которую я указываю.

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

Какому варианту вы доверяете больше всего?

Я использую IIS7, Coldfusion 8.


person crosenblum    schedule 07.09.2010    source источник
comment
Как вы думаете, почему cfdirectory удалит файлы за пределами указанного вами пути?   -  person Stephen Moretti    schedule 07.09.2010
comment
Поскольку раньше я не использовал функцию recurse, я не хотел слишком доверять ей, не спрашивая других людей.   -  person crosenblum    schedule 07.09.2010


Ответы (3)


Почему бы просто не использовать cfdirectory? Вы сказали, что беспокоитесь о том, что он удалит вещи «за пределами» указанной вами папки. Это не будет. Просто как тот. Если бы это было так, то тег был бы сломан. :)

person Raymond Camden    schedule 07.09.2010
comment
Просто не было на 100% комфортно с моим пониманием того, насколько далеко это будет повторяться. Я поэтому и спросил :) - person crosenblum; 07.09.2010
comment
Он делает именно то, что я хочу, и не более того... Фантастика... Я просто не был на 100% уверен, что смогу установить его и забыть, как говорил Ронко :) - person crosenblum; 07.09.2010
comment
Просто следите за этим путем к каталогу. Если у пользователя есть какая-либо возможность изменить его, вам придется его дезинфицировать, чтобы убедиться, что там нет никаких ../../windows/system32 =] - person Tyler Clendenin; 12.09.2010

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

<cfset targetDirectory = "C:\Websites\site\thisFolder" />
<cfif directoryExists(targetDirectory)>
<cfdirectory action="list" directory="#targetDirectory#" listInfo="" name="theseFiles" recurse="true" type="file" />
    <cfif theseFiles.recordcount gt 0>
    <cfloop query="theseFiles">
        <cffile action="delete" file="#targetDirectory#/#theseFiles.name#" />
    </cfloop>
    </cfif>
<cfdirectory action="delete" directory="#uploadDirectory#/#allFolders.name#" />
</cfif>
person RKolosky    schedule 07.09.2010
comment
Вам не нужно проверять RecordCount - если он равен нулю, cfloop все равно будет пропущен. - person Peter Boughton; 07.09.2010

что бы я сделал, это загрузить файл во временный каталог за пределами веб-корня. вы можете использовать gettempdirectory() для этого, который использует временный каталог вашей системы (c:\windows\temp для окон)

затем вы можете разархивировать файл в подкаталог вне временного каталога и выполнить некоторые проверки безопасности для разархивированных файлов и убедиться, что все в порядке, при этом не открывая ваш сайт для каких-либо атак. если все получится, вы можете переместить файлы в место их последнего упокоения. если нет, просто используйте cfdirectory (как указал cfjedimaster), чтобы удалить подкаталог и все файлы.

person rip747    schedule 07.09.2010