Как скрыть URL файла для большей безопасности

#php

#php

Вопрос:

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

Таким образом, в основном код не запрещает пользователям загружать файл, он даже скрывает URL файла из адресной строки, но когда кто-то щелкает правой кнопкой мыши на странице и просматривает исходный код страницы, у него может быть реальный URL файла, и каким-то образом они могут загружать его без каких-либо ограничений!

Нравится этот пример:

 https://www.example.com/files/J730F/GalaxyJ72017SM-J730FCOVER.pdf
  

Это мой код:

 if (!(isset($_GET['username']) amp;amp; !empty($_GET['username']))){
echo 'Only a member of this website can download this file. However, no username was specified in this download. Sorry for inconvenience.'; 
die;
}

$dl_username = $this->decrypt($_GET['username']);

if (gator::getUser($dl_username) == false){
echo 'Only a member of this website can download this file. However, the username provided does not exist in the database. Sorry for inconvenience.';   
die;
}
  

Есть ли способ скрыть эту вещь? например, использовать
.htaccess файл, чтобы ограничить этот вид загрузки!

Комментарии:

1. Разве я не говорил использовать сессию для этого раньше…..

2. Да, я спрашивал об этом заранее, но мой вопрос был недостаточно ясен, спасибо за ваше время, но я нашел действительно простой способ сделать это, вы можете увидеть мой ответ.

Ответ №1:

Я только что нашел очень простой способ сделать это, я использовал этот код, чтобы заблокировать прямой доступ к определенным типам файлов, просто добавьте это в свой файл .htaccess:

 RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?example.com [NC]
RewriteRule .(pdf|zip|txt|pcb|bin|rar|7z|rom)$ - [NC,F,L]
  

Комментарии:

1. а что, если бы я подделал HTTP_REFERER ? полагаться на точность этого значения сомнительно; поэтому считать это «мерой безопасности» откровенно абсурдно. обслуживание файлов из-за пределов веб-корня, при этом предоставляя временный URL для загрузки зарегистрированным пользователям, это может обеспечить достойный уровень контроля доступа.

Ответ №2:

Во-первых, вы должны хранить свою пользовательскую информацию в $_SESSION вместо использования $_GET . Посетители могут очень легко манипулировать $_GET , поэтому это совсем ненадежно. У вас должен быть правильный логин (т. Е. с именем пользователя и паролем), в котором хранится ваша информация о пользователе $_SESSION .

Теперь предположим, что у вас есть $_SESSION массив с "username" набором для входа пользователя. Вы можете изменить URL, которым вы поделились, с прямой ссылки PDF на прокси-вызов PHP-скрипта, например:

 https://www.example.com/files.php?path=J730F/GalaxyJ72017SM-J730FCOVER.pdf
  

Затем все, что вам нужно сделать, это ввести соответствующую проверку входа files.php перед фактическим отображением файла:

 <?php

session_start();

if (!isset($_SESSION['username']) || empty($_SESSION['username'])) {
  exit('Only a member of this website can download this file. However, no username was specified in this download. Sorry for inconvenience.');
} elseif (!isset($_GET['path']) || empty($_GET['path'])) {
  exit('You must specify the path for download.');
} elseif (strpos($_GET['path'], '../') !== false) {
  exit('Your path contains invalid pattern.');
}

// Note: ideally, $filedir should not be a publicly accessible folder.
$filedir = realpath(__DIR__ . '/files');
$filepath = realpath($filedir. ltrim($_GET['path'], '/'));

// realpath check for security
if (strpos($filepath . '/', $filedir) !== 0) {
  exit('The path you specified is not accessible.');
}

if (!is_file($filepath)) {
  exit('The file you specified does not exists.');
}

// show file, finally
header('Content-Type: ' . mime_content_type($filepath));
echo file_get_content($filepath);

  

Комментарии:

1. «Примечание: в идеале», .. не совсем идеально, это должно быть для определенного уровня безопасности

2. Будьте осторожны с $_GET['path'] из-за поперечного перемещения каталога, даже если вы проверяете, strpos($_GET['path'], '../' что это не гарантирует предотвращение, см. security.stackexchange.com/questions/74538/… — Единственный реальный способ обеспечить безопасность на 100% — это сохранить пути к файлам в базе данных и предоставить им ключ поиска (например, имя файла), таким образом, они никогда не коснутся пути.

3. @ArtisticPhoenix: Добавьте некоторые дополнительные меры предосторожности, чтобы проверить, находится ли файл в ожидаемой папке.

Ответ №3:

Хороший способ — создать файл .htaccess в root и добавить следующий скрипт в файл .htaccess.

 RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.] )$ $1.php [NC,L]