coldfusion - запретить прямой доступ к файлам, созданным пользователем и предназначенным для загрузки - PullRequest
0 голосов
/ 07 ноября 2018

Когда пользователь входит в нашу систему, он может создать отчет CSV. Этот отчет затем может быть загружен пользователем. Структура каталогов выглядит следующим образом:

siteroot.com/user/
siteroot.com/user/login/
siteroot.com/user/login/downloads/[file].csv

Доступ к каталогу / login / возможен только через зарегистрированного пользователя. Однако кто-то - если он знает URL-адрес - может перейти непосредственно к URL-адресу файла CSV и получить файл:

siteroot.com/user/login/downloads/myfile.csv

Есть ли лучшее (более простое) решение, чем удаление их из корня и затем использование cfdirectory / cfheader / cfcontent для извлечения файла CSV из каталога не-IIS и передачи его пользователю?

1 Ответ

0 голосов
/ 07 ноября 2018

Не помещайте эти файлы в папку, доступную через Интернет.

Если вы создаете экспорт данных, который не нужно хранить, создайте файл во временной папке (также не в общедоступной папке) и используйте <cfcontent>, чтобы отправить файл в браузер, который будет представить пользователю диалог загрузки. Вы удалите файл с сервера как часть этого процесса, поэтому вы будете запускать этот процесс каждый раз, когда кто-то запрашивает экспорт.

Это поддерживает ваш сервер в чистоте и сохраняет файл за логином. Вот суть, которую я создал, чтобы заглушить этот процесс . Он использует <cfspreadsheet> для завершения экспорта. Вот суть кода:

<cfspreadsheet action="write" filename="#config.full_temp_name#" query="config.q" />
<cfspreadsheet action="read" src="#config.full_temp_name#" name="local.xls" />
<cffile action="delete" file="#config.full_temp_name#" />

<cfif len(arguments.fileName) GT 0>
    <cfheader name="content-disposition" value="attachment; filename=#arguments.fileName#.#config.extension#" />
<cfelse>
    <cfheader name="content-disposition" value="attachment; filename=#config.temp_name#.#config.extension#" />
</cfif>
<cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(local.xls)#" reset="true" />
...