我的服务器上有一些图像和pdf文件,我在我的网站上使用 图像的路径是
<img src ='/import/folder/image.jpg'>
每张图片都与pdf相关联,该pdf与图片一起存放,如上图所示的pdf将位于/import/folder/pdffile.pdf
图像来源对用户可见
当有人查看页面来源并复制图片源并在我的基本网址后粘贴网址
假设我的基本网址是localhost.com 如果有人手动编写localhost.com/import/folder/image.jpg他可以访问我的整个图像和pdf文件,甚至我的整个文件系统
如何阻止用户访问我的文件结构?
我正在使用php和codeigniter
提前致谢
答案 0 :(得分:2)
他可以访问我的整个图像和pdf文件
这就是网络的运作方式。
甚至我的整个文件系统
当然不是完整的,只有你放入公共访问文件夹的文件
如何阻止用户访问我的文件结构
他们无法访问您的文件结构,只能访问公用文件夹 您无法阻止用户访问公用文件夹,因为您的网站将停止工作。
你必须提出更多确定的问题,为什么以及要保护哪些文件。
答案 1 :(得分:1)
在这种情况下很难阻止人们下载你的图像。当您在网站空间使用“/ import / folder /”时,它是一个公用文件夹。您可以使用.htaccess保存路径。
对于您的PDF文件,您可以通过php传送PDF文件。
<a href="getpdf.php?file=123.pdf">Get PDF 123</a>
在脚本中,您可以检查用户是否有权下载文件,并且文件是否存在,并将PDF作为application / pdf输出返回。
header('Expires: Thu, 19 Nov 1981 08:52:00 GMT');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: no-cache');
header("Content-Type : application/pdf");
header("Content-Disposition: attachment; filename=".$filename.".pdf");
然后人们可以下载文件。但在这种情况下,你必须保存PDF是他们的。
修改:
然后将.htaccess放到带有
的文件夹中deny from all
<FilesMatch "\.pdf$">
Order Allow,Deny
Deny from all
</FilesMatch>
答案 2 :(得分:1)
根据您的服务器容量和文件大小,您可以执行以下操作:
流 - 使用我称之为“数据代理”的JPEG和PDF文件 - 一个读取文件内容并将其流回浏览器的PHP脚本,如(注意设置正确的内容类型)(类似于Stony提出的,尽管他将readfile()部分删掉了):
$file_path = $download;
header('Content-Description: File Transfer');
header('Content-Type: audio/mpeg');
header('Content-Disposition: attachment; filename="'.$_GET['file'].'"');
header("Content-Transfer-Encoding: binary");
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));
ob_clean();
ob_end_flush();
readfile($file_path);
exit;
模糊文件。使文件名类似于md5($ filename。$ salt)并删除文件扩展名。如果您将文件放在不同的文件夹中(例如/ images和/ pdf),则不需要扩展流,因为您只读取文件的内容。您也可以将它们放在可访问的Web空间之外(我认为您需要open_base_dir),因此除了您之外没有人能够访问它们。使用.htacces进一步限制对文件的访问,如其他答案中所述。
为上述脚本使用会话,以便只有登录用户才能获得流式传输。
加密文件 - 您可以加密文件的整个内容。因此,即使有人获得文件内容,也会加密。您可以在流媒体之前解密它们。如果您使用安全加密算法,这应该是非常安全的。但是,这在很大程度上取决于文件大小和服务器容量,因为我认为加密整个文件可能会成为一个大问题。
使PDF密码受保护。虽然它不是很安全,因为它可以轻松删除,但它使基本用户在墙上运行......你也可以在服务器端使用自动脚本来实现这一点。
答案 3 :(得分:0)
将Options -Indexes
放在.htaccess文件中,放在localhost.com/import/folder/(或文档树的更高位置)。这将禁止访问localhost.com/import/folder
防止用户访问您的文件是不同的,如Stony建议的,您可以使用php流式传输文件。
编辑:我看到你对人们“猜测”图片网址的评论。您可以使用加密文件名存储所有图像。类似于文件名的md5哈希和上传时间的组合。然后将这些加密的名称存储在数据库表中......
答案 4 :(得分:-1)
您可以在.htaccess
中使用它RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://your_site_url/.*$ [NC]
RewriteRule \.(jpg)$ - [F]
这将阻止图像的直接访问,但图像将在您的网站中保持可见