我的网站上有一个包含* .jpg文件的密码保护目录(带.htaccess)。我不希望任何人都可以直接访问这些.jpgs - 但我想允许php脚本显示* .jpg文件。有可能吗?
对于那些想知道我为什么要这个的人: 我有一个注册表单,用户可以上传图片,在完成注册之前,他可以检查是否上传了正确的图片。目前,我将上传的图片保存在一个临时目录中,如果他完成了,我将图片移动到受密码保护的目录。但是,我不喜欢在每次注册时,图片是公开的短时间段(例如通过搜索引擎)。更糟糕的是,当有人上传图片但没有完成注册时,图片将永远保留在临时目录中,除非我以某种方式删除。但是如果我在特定时间内设置了一个cron-job来删除临时目录中的所有图像,那么如果某个图片在不利的时刻注册,那么它将被删除。
答案 0 :(得分:8)
h2ooooooo已经在评论部分回答了我的问题。
这是代码如何工作,在我的代码中我必须替换
<img src='link/to/protectet/picture.jpg'>
与
<img src='image.php'>
并且image.php仅由
组成<?
header('Content-Type: image/jpeg');
readfile('link/to/protectet/picture.jpg');
?>
有效。感谢。
答案 1 :(得分:0)
我不确定,这是否是您想要实现的目标,但我理解:
有一组图片文件存储在.htaccess密码保护文件夹中,只有经过注册和验证的用户才能直接在该文件夹中下载文件。
对于新注册的用户,有一段时间,当上传图像的会话被允许下载图像时,但是不允许其他会话(无论是否经过身份验证)这样做。
为了做到这一点你可能会:
由于您需要区分临时图像和有效图像:将前者存储在/ temp文件夹中实际上是一个好主意,因为临时文件永远不会与有效文件混淆。
对于尝试注册的每个会话,您都可以使用session_id()
(即$name = session_id() . '.jpg'
)为上传的图像文件命名。然后一个简单的脚本(类似于:php, file download)可以提供与当前会话相关的存储图像。此脚本可以是注册表单上<img>
标记的源地址。
对于/ temp中的废弃图像 - 一个cron作业确实可以摆脱它们。通过为每个文件调用mtime()
- 您可以轻松省略最近创建的文件 - 因此它们可能仍在使用中。
答案 2 :(得分:0)
h2ooooooo接受的答案很棒。但是,是什么阻止某人输入image.php的url地址并为图像提供服务呢? (事实上,这是我尝试过的,不幸的是,即使它在受密码保护的文件夹中,我也能够获取图像。)
似乎我们需要一种方法来确定请求来自同一网站上的页面,或者可能在此调用之前建立会话变量,并在提供图像之前检查其存在。对here:How to check if a request if coming from the same server or different server?
有很好的建议我最终做了以下事情(<img src="getUploadFile.php?fname=my.jpg">
):
<?
function requestedByTheSameDomain() {
$myDomain = $_SERVER['SCRIPT_URI'];
$requestsSource = $_SERVER['HTTP_REFERER'];
return parse_url($myDomain, PHP_URL_HOST) === parse_url($requestsSource, PHP_URL_HOST);
}
if(requestedByTheSameDomain()) {
$inputArr = array();
if($_SERVER["REQUEST_METHOD"] == 'POST') {
$inputArr = $_POST;
}
else {
$inputArr = $_GET;
}
$fname = $inputArr['fname'];
$path_info = pathinfo($fname);
$ext = $path_info['extension'];
if (in_array($ext, array('jpg','png','gif','jpeg','bmp','tif','tiff'))) {
$type = 'image';
$subType = $ext;
if($ext == 'jpg') $subType = 'jpeg';
if($ext == 'tif') $subType = 'tiff';
if($ext == 'svg') $subType = 'svg+xml';
}
else if(in_array($ext, array('mpg','ogg'))) {
$type = 'audio';
$subType = $ext;
}
else if($ext == 'mp4'){
$type = 'video';
$subType = $ext;
}
else if($ext == 'pdf') {
$type = 'application';
$subType = $ext;
}
header("Content-Type: $type/$subType");
readfile("images/$fname");
}
?>
剩下的就是禁用右键单击和/或将其作为背景图像来渲染Save-Image-As。