我正在开发一个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文档,但我无法访问图像。
答案 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
使用上面也关闭目录列表,它会给出禁止的错误。