#php #mysql
#php #mysql
Вопрос:
Я сделал небольшой веб-сайт просто для развлечения для обмена файлами, каждая учетная запись ограничена 20 файлами в день, все данные участников хранятся в таблице MySQL. Имя пользователя, пароль и номер загрузки. Когда кто-то нажимает на загрузить, запускается функция и сохраняет 1 внутри таблицы. и начнется загрузка.
Я подумал, что все работает отлично, после того, как я увидел файл журнала на моем сервере, и я нашел кого-то, кто загружает файл, не запуская функцию и не оставляя историю внутри базы данных!
Как это возможно! и как я могу сделать то же самое, чтобы я мог заблокировать эту ошибку!
Вот код:
if (isset($_GET['download']) amp;amp; !empty($_GET['download'])){
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;
}
$dl_user = gator::getUser($dl_username);
if ($dl_user['downloads'] > 20){
echo 'Cannot download more files for today! You have crossed the limit of downloading 20 files.';
die;
}
gator::updateUser($dl_user['username'], array('downloads' => $dl_user['downloads'] 1));
$filename = $this->filterInput($this->decrypt($_GET['download']));
if (in_array($filename, gatorconf::get('restricted_files'))) die;
if (!file_exists($_SESSION['cwd'].DS.$filename)) die;
// Set headers
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename="$filename"");
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
// output file
set_time_limit(0);
$file = @fopen($_SESSION['cwd'].DS.$filename,"rb");
while(!feof($file))
{
print(@fread($file, 1024*8));
ob_flush();
flush();
}
gator::writeLog('download - '.$filename);
echo 'Downloaded';
die;
}
РЕДАКТИРОВАТЬ: Существует два файла журнала, один для действий, которые записывают действия участников на веб-сайте, а другой на моем сервере Apache, который записывает все и все соединения даже для не пользователей.
И вот пример того, как выглядит ссылка на файл: «никто не может использовать горячие ссылки»
https://www.example.com/?download=MLB 820-2186 schematic diagram.pdfamp;username=Linda
Комментарии:
1. Можно ли получить доступ к этим файлам напрямую через URL?
2. Это на самом деле загрузка файлов или получение данных из базы данных?
3. @JeffUK Нет, я заблокировал горячие ссылки, они не могут этого сделать.
4. @Barmar «Files» они могут загружать файлы без запуска функции, это pdf-файл, хранящийся в безопасном месте на сервере, никто не может получить к нему доступ по прямой ссылке, к тому же зашифрованный
5. Как несанкционированная загрузка отображается в файле журнала? Вы говорите, что он запускает этот скрипт, но база данных не обновляется?