Защитите папку с помощью .htaccess RewriteRule для php - PullRequest
2 голосов
/ 14 апреля 2011

Мы создаем онлайн фотоальбом. Чтобы увидеть изображения, необходимо войти в систему. Мы также пытаемся защитить файлы изображений, но мы застряли в проблеме

С помощью переменной сеанса мы проверяем, вошли ли пользователи.

$_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-файл возвращает ï »¿

Мы создаем эти скрипты с помощью следующих ссылок:

Спасибо за любую помощь


UPDATE:

Я сделал несколько прототипов, и возвращение mime_content_type((string)$_SESSION['REQUEST_URI']); кажется пустым / нулевым.

Я поместил следующий код в 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 ]

1 голос
/ 15 апреля 2011

Со многими советами в этой теме я заставил это работать. Однако теперь он работает со строкой запроса в URL.

.htaccess файл в папке fotoalbum / uploads /:

Options -Indexes
<Files *>
  deny from all
</Files>

getfile.php файл в папке / fotoalbum /:

<?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);

?>

Чтобы получить изображение (или любой другой тип файла), URL-адрес будет getfile.php?f=file.extension (где file.extension - это файл в папке fotoalbum / uploads /.

Большое спасибо всем за помощь!

0 голосов
/ 14 апреля 2011

Привет Я делаю снимок здесь, но вы проверили, чтобы убедиться, что mime_content_type возвращает правильный тип MIME для вашего файла? Казалось бы, если бы заявление

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

не выводится правильно, тогда изображение или текстовый файл также не будут проходить правильно. PHP.net указывает, что функция mime_content_type устарела, поэтому вы можете попробовать функцию finfo_file .

Удачи!

0 голосов
/ 15 апреля 2011

Вы должны использовать 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();
?>
0 голосов
/ 14 апреля 2011

Я думаю, PHP-файл сохраняется с BOM , сохраните его без BOM.

Почему я так думаю: ï »¿выглядит как спецификация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...