Как запретить внешним пользователям просматривать файлы документов - PullRequest
4 голосов
/ 28 декабря 2011

Я построил онлайн-систему, которая позволяет пользователям загружать файлы PDF с помощью ColdFusion.Пользователи должны войти в систему, прежде чем они смогут загрузить файлы (PDF и документы Microsoft Office).(Это приложение предназначено только для сотрудников нашей компании.)

Однако только сегодня я узнал, что любой человек, имеющий доступ к Интернету, может просматривать файлы.С помощью только определенных ключевых слов, таких как «Медицинская форма myCompanyName» в поиске Google, они могут просматривать файлы PDF с помощью браузера.

Как я могу предотвратить это?

ОБНОВЛЕНИЕ
вот в чем моя проблема.Я создал папку для всех файлов PDF.каждый из файлов вызывается с использованием идентификатора из базы данных.если, скажем, пользователь хочет просмотреть медицинскую форму, ссылка будет: http://myApplication.myCompanyName/forms.cfm?Department=Account&filesID=001.

, если пользователь скопирует этот URL и выйдет из системы, он / она не сможет просмотреть этофайл. (отобразится страница входа в систему)

Однако без URL-адреса другие интернет-пользователи могут просматривать файлы pdf, просто выполняя поиск в сети, и поисковая система выдаст ссылку, которая указывает на них.сама папка без необходимости входа в систему.

Пример: PDF-файл медицинской формы хранится в папке с именем Document.когда пользователь Интернета ищет медицинскую форму, поисковая система свяжет ее с: http://myApplication.myCompanyName/Document/Medical%20Form.pdf

, в этой папке много PDF-файлов, и большинство из них являются конфиденциальными и предназначены только для внутреннего просмотра.в php мы можем отключить это с помощью .htaccess.Я хотел бы знать, есть ли что-нибудь подобное для холодного синтеза?

Ответы [ 4 ]

5 голосов
/ 28 декабря 2011

Вы можете отправлять файлы через код в одну строку, например:

<cfif isAuthorized>
    <cfcontent file="/path/to/files/outside/of/web/root/Form.pdf" type="application/pdf" reset="true" />
</cfif>

ColdFusion FTW, справа.

Обратите внимание, что обработка больших файлов (скажем, 100 МБ +) может вызвать некоторые проблемы, поскольку файлы передаются в ОЗУ перед отправкой. Похоже, это больше не правильно, как объясняет ответ Майка.

Другой вариант - использовать тип контента, например x-application, если вы хотите принудительно загрузить.

UPD

Вы хотите поместить этот код в файл (скажем, file.cfm) и использовать его для ссылок PDF. Примерно так:

<a href="file.cfm?filename=Xyz.pdf">Download file Xyz.pdf</a>

file.cfm:

<!--- with trailing slash --->
<cfset basePath = "/path/to/files/outside/of/web/root/" />

<cfif isAuthorized AND StructKeyExists(url, "filename") 
      AND FileExists(basePath & url.filename) 
      AND isFile(basePath & url.filename) 
      AND GetDirectoryFromPath(basePath & url.filename) EQ basePath>
    <cfcontent file="#basePath##url.filename#" type="application/pdf" reset="true" />
<cfelse>
    <cfoutput>File not found, or you are not authorized to see it</cfoutput>
</cfif>

UPD2

Добавлено GetDirectoryFromPath(basePath & url.filename) EQ basePath в качестве простой и быстрой защиты от упомянутой проблемы безопасности.

Лично я обычно использую ID / базу данных, хотя этот ответ изначально задумывался как простое руководство, а не на самом деле исчерпывающее решение.

4 голосов
/ 28 декабря 2011

Использование cfcontent, pre cf8, - очень плохая идея, поскольку перед передачей файл загружается в память целиком.CF8 и более поздние версии будут транслироваться с диска, что решает проблему с памятью.Однако, если у вас большие файлы, пользователи с медленными подключениями и / или интенсивной загрузкой, вам все равно придется беспокоиться о потере потоков.Каждая загрузка с помощью cfcontent связывает поток на время загрузки.

В зависимости от вашего веб-сервера вы можете обойти это, используя расширение x-sendfile.Это позволяет вам отправлять заголовок http с путем к файлу за пределами вашего корневого веб-каталога, и ваш веб-сервер обрабатывает отправку файла, освобождая cf для дальнейшей работы.об использовании mod_xsendfile на apache, http://www.bennadel.com/blog/2170-Streaming-Secure-Files-Efficiently-With-ColdFusion-And-MOD-XSendFile.htm и вот эквивалентный плагин IIS7 XSendFile https://github.com/stakach/IIS-X-Sendfile-plugin

4 голосов
/ 28 декабря 2011

Вам необходимо хранить PDF-файлы вне вашей веб-области.

Итак, предположим, что база вашего веб-приложения составляет

/ website / www

Все запросы http (web) обслуживаются оттуда.

/ website / pdf

может быть путем, в котором хранятся все PDF-файлы.Этот путь не доступен через URL, так как он не обслуживается вашим веб-сервером.

Тогда в www

у вас есть что-то вроде

downloadpdf.cfm?file=NameOfPDF.pdf

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

<cfcontent type="application/pdf" file="/website/pdf/#url.file#" />
0 голосов
/ 28 декабря 2011

Вы можете получить фрагмент кода для вспомогательного тега CFWheels SendFile () http://cfwheels.org/docs/1-1/function/sendfile

https://gist.github.com/1528113

...