我完成了一个仅使成员从页面下载文件的小脚本之后,我发现人们只要查看页面源代码并从那里下载文件,便可以拥有文件链接。
因此,基本上,代码限制了成员没有下载文件,它甚至隐藏了地址栏中的文件URL,但是当有人右键单击页面并查看页面源代码时,它可以具有文件真实URL,以某种方式他们可以不受任何限制地下载它!
像这个例子:
https://www.example.com/files/J730F/GalaxyJ72017SM-J730FCOVER.pdf
这是我的代码:
if (!(isset($_GET['username']) && !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文件来限制这种下载!
答案 0 :(得分:0)
首先,您应该将用户信息存储在$_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 :(得分:0)
我刚刚发现了一种非常简单的方法 我使用此代码来阻止直接访问特定文件类型 只需将其添加到您的.htaccess文件中即可:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com [NC]
RewriteRule \.(pdf|zip|txt|pcb|bin|rar|7z|rom)$ - [NC,F,L]
答案 2 :(得分:0)
好的方法是在根目录中创建.htaccess文件,并在.htaccess文件中添加以下脚本。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]