Разрешить PHP-скрипту доступ к PDF-файлам в папке, но запретить прямые ссылки на URL - PullRequest
0 голосов
/ 06 ноября 2018

На веб-сайте Godaddy, использующем CPanel, у меня есть небольшой PHP-скрипт, который показывает каждую строку в текстовом файле на сервере. Каждая строка содержит частную ссылку на ссылку в формате PDF, которую может видеть только зарегистрированный пользователь. Ссылки указывают на различные PDF-файлы в одной папке на сервере. Код работает нормально, и я могу нажать на ссылку и посмотреть каждый PDF.

Проблема заключается в том, что каждый PDF-файл также можно просмотреть с помощью прямого URL-запроса (например, website / folder / pdfname.pdf). Поскольку это частные PDF-файлы, я не хочу, чтобы они были публичными. Я попытался изменить разрешения CPanel для папки на «владелец», но это, похоже, не позволяет PHP-скрипту открывать PDF-файлы.

Есть ли способ разрешить PHP-скрипту доступ к PDF-файлам в папке, но запретить прямые URL-ссылки?

ПРИМЕЧАНИЕ: я не особо разбираюсь в PHP или CPanel - извините.

код ...

$fname = "PDF-" . $user_name.".txt";
$fnum = fopen($fname,"r");
echo "<tr>";
While (($str = fgets($fnum)) !==  false) {
    $arr = explode("|",$str);   
    for ($x  = 0 ;  $x < count($arr);  $x++) {
        echo "<td>$arr[$x]</td>";
    }
    echo "</tr>";   
}
echo "</tr>";
fclose($fnum);

Содержимое файла ...

Xyz Company|21 Jan 2018|<a href="http://website.com"> website link</a>
Xyz Company|21 Jan 2018|<a href="http://website.com"> website link</a>
Xyz Company|21 Jan 2018|<a href="http://website.com"> website link</a>
Xyz Company|21 Jan 2018|<a href="http://website.com"> website link</a>*

1 Ответ

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

Кроме удаления файлов из корня, если вы используете apache, вы можете изменить .htaccess (я уверен, что в Windows-системе есть web.config эквивалент) , чтобы запретить доступ к определенным файлам напрямую. Если вы добавите этот фрагмент в этот файл, он будет запрещать файлы с расширением .pdf:

<FilesMatch "\.(pdf)$">
Order Allow,Deny
Deny from all
</FilesMatch>

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

http://www.example.com/?file=1

или если вы просто делаете простое сканирование:

<?php
# The folder that the PDFs are in
$dir = __DIR__.'/website/folder/';
# Loop over a scan of the directory (you can also use glob() here)
foreach(scandir($dir) as $file):
    # If file, create a link
    if(is_file($dir.$file)): ?>
<a href="?action=download&file=<?php echo $file ?>"><?php echo $file ?></a>
<?php
    endif;
endforeach;

Затем, если пользователь пытается загрузить с помощью ссылки, вы проверяете, что он в первый раз вошел в систему, и, если они есть, загрузите файл, выполнив скрипт, например, ДО ТОГО, как вы выводите что-либо еще в браузер (включая пробелы) )

<?php
session_start();
# First check that the user is logged in
if(empty($_SESSION['username']))
    die('You must be logged in to download this document.');
# Not sure which directory you are currently in, so I will assume root
# I would do basename() here incase the user tries to add in something like:
# ../index.php and tries to download files they are not supposed to
$file = __DIR__.'/website/folder/'.basename($_GET['file']);
if(!is_file($file))
    die('File does not exist.');
# Double check that the file is a pdf
elseif(strtolower(pathinfo($file, PATHINFO_EXTENSION)) != 'pdf')
    die('File appears to be invalid.');
# Start download headers
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
...