首页 > 解决方案 > 为未登录用户保护 .PDF 和 .JPG

问题描述

我想在文件夹中建立一个包含受保护数据的网站。我在我的 PHP 中有一个会话检查,仅在登录时显示数据。

数据是一对 .PDF 和 .JPG 文件。

但是,当 nog 登录用户完整的 url 搜索时,他可以找到并打开文件。示例:www.domain.com/protected-data/file.pdf

我该如何保护这个?

我已经用 .htaccess 做了一些技巧。

Order Allow,Deny
Allow from all
<Files ~ "\.(gif|jpg|png|pdf)$">
Deny from all
</Files>

但是即使用户登录,这个脚本也会拒绝我的所有文件。

标签: php.htaccessfiledata-protection

解决方案


这个想法是将您的文件放在外部无法获得的目录中。假设您有以下目录结构:

|_src
     \_.htaccess  
|_private  
     \_.htaccess  
|_public  
     \_read.php  

src/:包含你的类,源代码。
private/:包含您的 JPG 和 PDF 文件。
public/:包含您的前端控制器,这是互联网上唯一可用的直接方式。

src/.htaccess

# No one should be able to access your source code from Internet
Deny from All

私人/.htaccess

# No one should be able to access your private files from Internet
Deny from All

这样做只能从 Internet 访问public/目录。在您的public/目录中,您可能有一个读取这些文件的 PHP 文件。这是一个小例子。

公共/read.php

<?php
session_start();
//if the user is logged, read the file and echo it
if (1 === $_SESSION['logged']) {
    //Filename to read could be given like ?file=invoice.pdf
    $file = $_GET['file'];
    //Warning: you should sanitize the $file to prevent an attacker to give a file like "../src/yourclass.php".
    echo file_get_contents(__DIR__.'/../private/'$file);
}

请参阅有关Deny的Apache 文档


推荐阅读