Запретить любой доступ к файлам через http, если не выполнено определенное условие - PullRequest
1 голос
/ 08 октября 2010

Я создаю приложение PHP, и у меня возникли проблемы с поиском решения проблемы, с которой я столкнулся. Мне нужно как-то полностью запретить доступ любому, кто пытается получить доступ к файлам на веб-сервере (вероятно, возвращая ошибку 403 Forbidden или что-то еще) через HTTP, если не выполнено определенное условие, такое условие будет проверяться для каждого подключения. Мне нужно найти лучший способ сделать это, я предполагаю, что мне нужно установить некоторые специальные настройки в Apache, которые я могу изменить с помощью PHP, но эти настройки Apache, очевидно, можно настраивать с помощью PHP. Как вы можете догадаться, я могу хорошо писать на PHP, но у меня мало опыта работы с расширенными конфигурациями Apache.

Я думал о том, что, возможно, если бы я использовал chmod через PHP, чтобы изменить права доступа к файлу для проверенного пользователя и заставить их вернуться обратно при закрытии соединения, это сработало бы, но если есть параллельные соединения, тогда пользователи, подключающиеся после слов, будут иметь полный доступ независимо от того, действительны они или нет, они могут просто обойти проверку. Может быть, есть лучший способ сделать это так.

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

Ответы [ 2 ]

2 голосов
/ 08 октября 2010

поместите ваши файлы в каталог и деактивируйте доступ http через .htaccess.затем напишите php-скрипт, который проверяет это условие, и если оно истинно, верните запрошенный файл через php следующим образом:

<?php
define(DIR, "save_folder/"); 
$filename='the_file_to_show.pdf'; 
$fileextension= explode(".", $filename);
header("Content-type: application/$fileextension[1]"); 
header("Content-Disposition: attachment; filename=".$filename.""); 
header("Content-Length: ".filesize(DIR.$filename)); 
readfile(DIR.$filename);
?>

поместите это в ваш .htaccess

<Directory ~ "save_folder">
    Order allow,deny
    Deny from all
</Directory>
0 голосов
/ 08 октября 2010

Это действительно зависит от "условий", которые вы проверяете, однако вам не нужно связываться с chmod. Если все «условия» связаны с самим HTTP-запросом (т. Е. Отправить файл на основе запрошенного файла, строки запроса, доступа к IP-адресу и т. Д.), То вы можете сделать это строго с помощью .htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
Rewrite Base /

RewriteCondition {...}
RewriteRule (.*) - [F]
</IfModule>

Это перенаправит их в заголовок «Запрещено», если они соответствуют условиям, указанным в {...}. См. Этот ресурс для некоторых примеров .

Если вам нужен больший контроль или если вы хотите отказать файлам, основанным на чем-то более конкретном (например, отправить ошибку 403, если они не вошли в систему), вы захотите перенаправить на скрипт PHP.

.htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
Rewrite Base /

RewriteRule (.*) parse.php
</IfModule>

parse.php:
if({conditions}){
    header("HTTP/1.0 403 Forbidden"); // 403 error!
} else {
    /* include() the file if it's PHP, otherwise just echo the file contents */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...