如何隐藏文件网址以提高安全性

时间:2019-03-22 03:31:21

标签: php

我完成了一个仅使成员从页面下载文件的小脚本之后,我发现人们只要查看页面源代码并从那里下载文件,便可以拥有文件链接。

因此,基本上,代码限制了成员没有下载文件,它甚至隐藏了地址栏中的文件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文件来限制这种下载!

3 个答案:

答案 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]