通过.htaccess RewriteRule保护文件夹到php

时间:2011-04-14 14:16:28

标签: php image security .htaccess

我们正在制作在线相册。人们需要登录才能看到图片。我们也试图保护图片文件,但我们遇到了问题

通过会话变量,我们检查用户是否已登录。

$_SESSION['is_ingelogd'] 

我们构建一个安全页面(检查用户是否已登录)。我们将此页面包含在每个必须保护的页面中。但现在我们也希望保护图像。

因此,我们构建了一个.htaccess文件,该文件将我们照片文件夹中文件的所有请求引用到php页面。 php页面必须检查用户是否已进入。 如果用户没有进入,它将回显带有登录请求的文本。 如果用户已登录,则php文件必须发送所请求的文件(图像)。

我们使用以下代码执行此操作:

.htaccess文件(在文件夹/ fotoalbum / uploads /中):

RewriteEngine On
RewriteBase /fotoalbum/
RewriteCond %{SCRIPT_FILENAME} !image\.php
RewriteCond %{REQUEST_URI} !image\.php
RewriteRule ^(.*)$ image.php [QSA,L]

.php文件(在文件夹/ fotoalbum /中):

<?php
session_start();

if ($_SESSION['is_ingelogd'] == "1") {
    $type = mime_content_type((string)$_SESSION['REQUEST_URI']);
    header("Content-type: ".$type);
    echo file_get_contents($_SESSION['REQUEST_URI']);
    exit;
} else{
    echo 'Please <a href="../login.php">login</a> to see this  
file.';
}

?>

此代码可以正常工作; 如果用户没有进入并尝试打开文件夹/ fotoalbum / uploads /的任何文件,则php会显示登录请求。

但是如果用户登录,我们看不到图片。 在IE9中,屏幕保持空白,在FireFox 3.6中,png返回图像不能为的消息 显示,因为它包含错误。 jpg返回它的url,txt文件返回

我们借助以下链接构建此脚本:

感谢您的帮助


更新

我做了一些原型设计,mime_content_type((string)$_SESSION['REQUEST_URI']);的返回似乎是空白/ null。

我将以下代码放在php文件中:

<?php
$serveruri = parse_url($_SERVER['REQUEST_URI']);
$fileuri = (string)('./uploads/'.basename($serveruri['path']).PHP_EOL);
$file = strval($fileuri);

echo 'URL Is: '.$file;  
echo '<br />type Is: '.mime_content_type((string)$file);
exit;
?>

浏览器显示:

URL Is: ./uploads/test.jpg
Type Is: 

您可以看到它不会回显内容类型。 但是当我设置

$file = './uploads/test.jpg';

它完美地回归:

URL Is: ./uploads/test.jpg
Type Is: image/jpeg

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

通过这个主题的许多提示,我使它成功了。 但是它现在可以使用URL中的查询字符串。

文件夹fotoalbum / uploads /中的

.htaccess文件:

Options -Indexes
<Files *>
  deny from all
</Files>
文件夹/ fotoalbum /中的

getfile.php文件:

<?php

//this file checks if user is logged in and dies the request if the user is not logged in
include_once('./config.php');

$file = "uploads/" . $_GET['f'];
$type = mime_content_type($file);

header("Content-type:" .$type);
echo file_get_contents($file);

?>

要获取图像(或任何类型的文件),网址为getfile.php?f=file.extension(其中file.extension是文件夹fotoalbum / uploads /中的文件。

非常感谢大家的帮助!

答案 1 :(得分:0)

我猜PHP文件与BOM一起保存,保存时没有BOM。

为什么我猜这个:看起来像一个BOM

答案 2 :(得分:0)

您好 我在这里拍摄,但你检查过以确保mime_content_type为你的文件返回正确的mime类型?这似乎是声明

header("Content-type: ".$type);

输出不正确,则图像或文本文件也无法正确输出。 PHP.net表示不推荐使用mime_content_type函数,因此您可能想要试用finfo_file函数。

祝你好运!

答案 3 :(得分:0)

在将图像和其他二进制文件传输回客户端时,应使用readfile()而不是echo file_get_contents()。

<强>更新

您使用mime_content_type()时遇到的问题是PHP_EOL正在添加换行符。还有很多不必要的类型铸造。以下是适用于您的清理版本:

<?php
$serveruri = parse_url($_SERVER['REQUEST_URI']);
$file = basename($serveruri['path']);


echo 'URL Is: ' . $file;  
echo '<br />type Is: ' . mime_content_type($file);

exit();
?>