Защита папки сервера от незарегистрированных пользователей WordPress

#wordpress #.htaccess #directory

#wordpress #.htaccess #каталог

Вопрос:

У меня есть сайт WordPress, который скрывает определенные ссылки в своем сообщении для незарегистрированных пользователей. Ссылки ведут в папку, хранящуюся на сервере (ничего общего с wp-uploads, все загружено вручную). Например —

http://domain.com/courses/course-one/index.html

Я хотел бы защитить http://domain.com/courses папка, чтобы любой, кто вводит или вставляет ссылку напрямую, или приходит с другого сайта, не имел доступа к файлам внутри.

Возможно ли разрешить доступ только пользователям, которые в данный момент вошли на сайт? Или, может быть, ссылка работает, только если перейти с самих страниц сайта?

Комментарии:

1. Взгляните на эту статью: willmaster.com/blog/contentprotection/htaccess-cookie.php

2. Это большое спасибо. Я могу установить свой собственный cookie для зарегистрированных пользователей и протестировать его в htaccess. Попал в точку!

Ответ №1:

Я могу придумать два способа сделать это

Использование файлов cookie

Как и предлагали funkysouls, мы можем создать файл .htaccess, чтобы проверить, авторизован ли пользователь. Например:

 RewriteEngine on
RewriteCond %{REQUEST_FILENAME} ^.*(mp3|m4a|jpeg|jpg|gif|png|bmp|pdf|doc|docx|ppt|pptx|)$
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC]
RewriteRule . - [R=403,L]
  

Этот файл .htaccess просто проверяет, есть ли у пользователя файл cookie с именем «wordpress_logged_in». Если нет файла cookie «wordpress_logged_in», то отображается страница, содержащая 403 записи.

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

Использование PHP-скрипта

Другим решением является использование файла .htaccess для «перенаправления» на php-скрипт. Например:

 RewriteEngine on
RewriteCond %{REQUEST_FILENAME} ^.*(mp3|m4a|jpeg|jpg|gif|png|bmp|pdf|doc|docx|ppt|pptx|)$
RewriteRule . http://<HOST>/<YOUR-PHP-FILE>.php?file=%{REQUEST_FILENAME}
  

Обратите внимание, что мы передаем имя файла ( REQUEST_FILENAME ) нашему php-файлу через параметры запроса.

В файле php вы можете проверить наличие пользовательских разрешений и предоставить файл пользователю:

 <?php
define( 'WP_USE_THEMES', false );

# load wordpress functions. We need that to retrive loged user information
include('../../wp-load.php');

# get filename from query params
$filename = $_GET['file'];

# check if user is loged in
global $current_user;
get_currentuserinfo();
$can_access = ($user_level > 1);

# You could also check if the user is an adm
# $is_adm = current_user_can('administrator');


# Clean buffer management (prevent erros at file "generation")
while (ob_get_level()) {
   ob_end_clean();
}

if ($can_access){
        header('Content-Type: '.mime_content_type($filename));

        $read = readfile($filename);

        if (!$read){
                echo "error while loading the file";
        }
}else{
        echo "you can not access this file";
}

?>
  

Комментарии:

1. Привет, @giusti. Я отредактировал свой ответ, чтобы он меньше походил на другой вопрос.

2. Привет, @Anny. Возможно, я допустил ошибку. Спасибо, что дали мне знать.