防止用户从网站复制文件

时间:2012-03-30 09:37:17

标签: php security codeigniter

我的服务器上有一些图像和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

提前致谢

5 个答案:

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

根据您的服务器容量和文件大小,您可以执行以下操作:

  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;
    
  2. 模糊文件。使文件名类似于md5($ filename。$ salt)并删除文件扩展名。如果您将文件放在不同的文件夹中(例如/ images和/ pdf),则不需要扩展流,因为您只读取文件的内容。您也可以将它们放在可访问的Web空间之外(我认为您需要open_base_dir),因此除了您之外没有人能够访问它们。使用.htacces进一步限制对文件的访问,如其他答案中所述。

  3. 为上述脚本使用会话,以便只有登录用户才能获得流式传输。

  4. 加密文件 - 您可以加密文件的整个内容。因此,即使有人获得文件内容,也会加密。您可以在流媒体之前解密它们。如果您使用安全加密算法,这应该是非常安全的。但是,这在很大程度上取决于文件大小和服务器容量,因为我认为加密整个文件可能会成为一个大问题。

  5. 使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]

这将阻止图像的直接访问,但图像将在您的网站中保持可见