Защищать PDF-документы от прямого доступа в URL-адресе

Я хочу защитить файл PDF от прямой связи, но вместо этого у моих зарегистрированных пользователей есть доступ к нему. У меня есть ссылка, которая в настоящее время переходит к функции javascript, которая отправляет форму: $ ('nameofdoc'). SetProperty ('value', doc); . Document.getElementById ( 'SendMe') представляет ();

где sendme – это имя формы и имя документа doc – индекс документа, который я хочу отобразить.

Затем он переходит к файлу php:

$docpath = $holdingArray[0].$holdingArray[1]; $file = $holdingArray[0]; //file name $filename = $holdingArray[1]; //path to the file] header( 'Location:'.$docpath ) ; header('Content-type: application/pdf'); header('Content-Disposition: attachment; filename="'.$filename . '"'); readfile($filename) 

Все это прекрасно работает, загружает файл и выводит PDF-файл. То, что я не могу сделать, это защитить каталог от прямой ссылки – то есть www.mydomain.com/pathToPdf/pdfname.pdf

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

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

благодаря

Обновить

У меня была большая помощь, спасибо, но я еще не совсем там.

У меня есть файл .htaccess, который теперь запускает другой php-файл, когда PDF-запрос запрашивается из каталога:

  RewriteEngine on RewriteRule ^(.*).(pdf)$ fileopen.php 

Когда файл fileopen.php запускается, он не может открыть файл pdf

  $path = $_SERVER['REQUEST_URI']; $paths = explode('/', $path); $lastIndex = count($paths) - 1; $fileName = $paths[$lastIndex]; $file = basename($path); $filepath = $path; if (file_exists($file)) { header( 'Location: http://www.mydomain.com'.$path ) ; header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=".$file); readfile($filepath); }else{ echo "file not found using path ".$path." and file is ".$file; } 

Выходной файл не найден с использованием path /documents/6/Doc1.pdf, а файл Doc1.pdf

но файл существует и находится в этом директории – любые идеи?

OKAY Я рад сообщить, что Ярослав действительно помог мне разобраться с проблемой. Его метод работает хорошо, но сложно собрать все материалы каталога. В конце концов я провел несколько часов, играя с комбинациями, чтобы заставить его работать, но принцип, который он дал, хорошо работает. благодаря

Лучшим способом было бы защитить эту папку с помощью htaccess, как вы уже упоминали. Таким образом, вы помещаете все PDF-файлы в папку pdf /, а в той же папке pdf вы выходите из файла .htaccess:

 RewriteEngine on RewriteRule .* your-php-script.php 

Теперь никакие файлы не доступны по url в этой папке. Каждый запрос к каждому файлу в этой папке возвращает результат, возвращаемый скриптом php-script.php. В вашем php-script.php вы делаете что-то вроде этого:

 //Check if user has right to access the file. If no, show access denied and exit the script. $path = $_SERVER['REQUEST_URI']; $paths = explode('/', path); $lastIndex = count($paths) - 1; $fileName = $paths[$lastIndex]; // Maybe add some code to detect subfolder if you have them // Check if that file exists, if no show some error message // Output headers here readfile($filename); 

Теперь, если пользователь открывает domain.com/pdf/nsa-secrets.pdf Apache запустит ваш php-script.php. Сценарий будет иметь переменную $ _SERVER ['REQUEST_URI'], установленную в "domain.com/pdf/nsa-secrets.pdf". Вы берете последнюю часть (имя файла) и выводите ее пользователю (или нет).

Это не позволит кому-либо получить доступ к файлам непосредственно из Интернета, зная URL. Если у кого-то есть прямой доступ к файлам на вашем сервере, это не остановит их. С другой стороны, я думаю, что любой общий хостинг запрещает пользователям получать файлы других клиентов. Единственный способ сделать это – это каким-то образом взломать сервер. Но тогда мы становимся очень параноиками, и если это может быть для вас, вы не должны использовать общий хостинг в первую очередь.

Если вы не можете заставить htaccess работать, вы можете попытаться обфускать файлы, поэтому было бы трудно определить их для кого-то на улице. Например, измените файл с mySecretData.pdf на djjsdmdkjeksm.pdf. Это может немного помочь.

Я хочу защитить файл PDF от прямой связи, но вместо этого у моих зарегистрированных пользователей есть доступ к нему.

Проверьте, чтобы перед потоковой передачей содержимого PDF был проверен подлинный пользователь.

Это небрежно, но может работать, если вы можете настроить базу данных MYSQL. Он позволяет вам передать «пароль» в URL как строку MD5 или как чистый текст, если хотите. Попытка установить какую-то безопасность без использования htaccess или существующей работы фрейма не вызывает сомнений. Однако это даже не будет прикреплять файл к потоку, пока он не узнает, что вы «прошли проверку подлинности». Я думаю, вы могли бы сделать это немного лучше, если бы вы установили страницу входа в систему, которая сохранила файл cookie локально, тогда вам не понадобится передайте «кодовую фразу» в URL-адресе.

  $file = $_GET['file']; $pass = $_GET['pass']; $download_folder = '../Protected'; $file = basename($file); $filepath = "$download_folder/$file"; if (file_exists($filepath)) { if(CheckUser($pass)){ header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=$file"); session_write_close(); readfile($filepath); } else { echo 'Not Authenticated!'; } } else { echo 'No File!'; } function CheckUser($value){ $con = mysqli_connect("test.com","test","123456","my_db"); // Check connection if (mysqli_connect_errno()){ echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $result = mysqli_query($con,"SELECT user FROM pass_table WHERE password =".md5($value).";"); while($row = mysqli_fetch_array($result)){ mysqli_close($con); //return $row['user']; if($row['user']){ return true; } } mysqli_close($con); return false; }