2011-12-28 4 views
4

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

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

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

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

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

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

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

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

+0

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

+0

@DaleFraser, это значит, что мне нужно переместить папку PDF вне myApplication? – dygta

+0

Да, это самый простой способ, если вы не хотите, чтобы Google индексировал их и людей, чтобы иметь возможность обмениваться ссылками. –

ответ

5

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

<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/базы данных, хотя этот ответ изначально был предназначен как простое руководство, а не действительно комплексное решение.

+0

привет Сергий. Хорошо. так где я должен поставить код? это какой-то файл конфигурации, который должен быть помещен за пределы папки pdf? – dygta

+0

@dygta Нет, это просто «прокси» для загрузки файлов. Подробнее см. Обновление. – Sergii

+0

Я тоже использую подход базы данных. обратитесь к моему обновленному Вопросу. спасибо – dygta

4

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

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

/сайт/WWW

Все HTTP (веб) запросы подаются оттуда.

/сайт/PDF

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

Тогда в WWW

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

downloadpdf.cfm?file=NameOfPDF.pdf 

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

<cfcontent type="application/pdf" file="/website/pdf/#url.file#" /> 
+1

Одна заметка здесь, как это показано, открывает дыру в безопасности, поскольку она позволит посетителю загружать практически любой файл на сервере. Лучшим подходом было бы передать идентификатор файла (из базы данных) по URL-адресу, проверить, что он действителен, получить имя файла из базы данных, затем использовать CFCONTENT для обслуживания файла. Никогда не доверяйте пользовательскому вводу, как это. –

+0

Проголосовал за то, что он страдает от дыры в безопасности, о которой упоминает Джастин, плюс не является хорошим решением в любом случае по причинам, которые объясняет Марк (хотя после вашего ответа, Дейл). Люди * действительно * не должны были проголосовать за этот ответ! –

+2

Я считаю несправедливым, чтобы снизить этот ответ только потому, что он не является всеобъемлющим или не «лучшим подходом» - он по-прежнему полезен. Вы можете «исправить» дыру в безопасности и использовать этот подход. Вот почему у нас есть система комментариев, для лучшего ответа. – Sergii

4

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

В зависимости от вашего веб-сервера вы можете проложить маршрут вокруг этого с помощью расширения x-sendfile. Это позволяет отправлять HTTP-заголовок с путём к файлу вне вашего веб-корня, и ваш веб-сервер обрабатывает отправку файла, освобождая cf для дальнейшей работы.

Вот статья Бен Надель об использовании mod_xsendfile на апача, http://www.bennadel.com/blog/2170-Streaming-Secure-Files-Efficiently-With-ColdFusion-And-MOD-XSendFile.htm и вот эквивалентную IIS7 XSendFile Plugin https://github.com/stakach/IIS-X-Sendfile-plugin

+0

Действительно ли это «плохая идея»? Может быть, вы сначала должны задать максимальный размер документа для этого конкретного приложения? Предполагая, что все приложения, отправляющие фильмы 720p - это плохая идея. – Sergii

+0

Да, это плохая идея. Даже никакие сайты с низким трафиком, использующие 'CFCONTENT' для обслуживания файлов, будут очень быстро поглощать ОЗУ сервера и потоки, заставляя сервер затормозить, чтобы замедлить работу (для * каждого * с помощью сайта) или остановить его. У меня есть опыт из первых рук. Его можно смягчить, но в целом есть более эффективные решения этой проблемы, чем использование «CFCONTENT». В то время как один * может * решить эту проблему с помощью «CFCONTENT», не следует. –

+0

Dale: У меня есть ссылка на мою страницу LinkedIn в моем профиле, поэтому я не уверен, каким образом вы будете «разоблачать меня» за пределами общедоступного профиля, который я уже поддерживаю. Я не трогал и не плакал: я просто указал - допустимые - недостатки в вашем обсуждаемом решении. Они основаны на опыте реального мира (из которых у меня 10yrs, что не является ни исключительным, ни тривиальным). Вы не пугаете меня ни малейшим образом, однако из-за его ненадлежащего характера, если вы попытаетесь снова угрожать мне, я немедленно сообщу вам об устройствах StackOverflow. Расти. –

Смежные вопросы