我如何拒绝直接访问目录,但允许从PHP脚本中进行访问?

时间:2017-05-22 17:23:50

标签: php apache .htaccess permissions

我正在开发一个Web应用程序,我需要保存并显示图像和pdf文档。

我想拒绝直接访问图片和文档及其容器文件。我的意思是,当有人试图通过url访问该文件夹时,应该收到403-forbidden错误。

为此,我在文件夹中创建了一个.htaccess文件,如下所示:

Order deny,allow
Deny from all 

使用我的网络应用程序,通过php脚本,访问这样的pdf文档没有问题

header('content-type: application/pdf');
readfile('../../../files/'.$document);

但是当我尝试使用<img style=max-width:100% src=../files/'.$image.'>'访问图像时,我的访问被拒绝,并且我收到了禁止的http状态代码403。

如何使用我的网络应用程序访问图像,但拒绝直接访问图像?

此外,我想知道为什么我可以访问pdf文档,但我无法访问图像。

2 个答案:

答案 0 :(得分:1)

我会为这些文件类型中的任何一种使用处理程序。

将文件放在Web可访问文件系统之外。即如果您的Web根目录是/ var / www / html,则创建/ var / www / files /目录并将所有文件存储在那里。

$file_id = intval($_REQUEST['file_id']);

$sql = sprintf("SELECT * FROM files WHERE file_id=%d",$file_id);
$query = $mysqli->query($sql);
$file = $result->fetch_assoc()

// add business logic for 
// if $user_id is allowed to view $file_id

if (preg_match("/\.pdf$/i",$file['filename'])){
    header('content-type: application/pdf');
} else  if (preg_match("/\.(jpg|gif|png)$/i",$file['filename'])){
    header('content-type: application/pdf');
} else {
    die("Unknown file type");
}

$full_path = sprintf("/var/www/files/%s",$file['filename']);
readfile($full_path);

这将允许您使用应用程序逻辑来确定用户应访问哪些文件,记录访问权限并将其保留在Web可访问目录之外。

所以不要使用像这样的东西

<img style=max-width:100% src=../files/'.$image.'>'

我建议使用与此类似的语法来处理图像

<img style=max-width:100% src=/handler.php?file_id='.$file_id.'>'

以及用于下载PDF的链接

<img style=max-width:100% src=/handler.php?file_id='.$file_id.'>'

假设您拥有PDF和图像数据库,那应该是非常简单的。像这样简单。

CREATE TABLE `files` (
  `file_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `file_name` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`file_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

答案 1 :(得分:0)

尝试使用以下规则,

Order deny,allow
Deny from all
allow from 127.0.0.1

它将允许您托管Web应用程序的本地服务器地址。

编辑:

Options -Indexes

使用上面也关闭目录列表,它会给出禁止的错误。