Как защитить загрузки, если пользователь не зашел в систему?

Я использую wordpress для частного сайта, где пользователи загружают файлы. Я использую «Private WordPress» для предотвращения доступа на сайт, если пользователь не вошел в систему.

Я хотел бы сделать то же самое с файлами, загруженными в папку uploads.

Поэтому, если пользователь, к которому он не входит в систему, не сможет получить доступ к: https://xxxxxxx.com/wp-content/uploads/2011/12/xxxxxxx.pdf если они пытаются получить доступ, но они не регистрируются, то они должны быть перенаправлены на страницу входа, например.

Я нашел плагин под названием private files, но последний раз обновлялся в 2009 году, и он, похоже, не работает на моем Wordpress.

Кто-нибудь знает какой-либо метод? Метод Hotlinking будет достаточно, чтобы защитить это?

Я также нашел этот метод:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond% {REQUEST_URI} ^. * Uploads /private /.*
RewriteCond% {HTTP_COOKIE}! ^. * Wordpress_logged_in. * $ [NC]
RewriteRule. /index.php [R, L]
RewriteRule ^ index \ .php $ - [L]
RewriteCond% {REQUEST_FILENAME}! -F
RewriteCond% {REQUEST_FILENAME}! -D
RewriteRule. /index.php [L]
& Lt; /IfModule >
# END WordPress

Но тогда любой пользователь, который реплицирует cookie, может передать это право? Отношения

65 голосов | спросил chifliiiii 22 ThuEurope/Moscow2011-12-22T20:46:18+04:00Europe/Moscow12bEurope/MoscowThu, 22 Dec 2011 20:46:18 +0400 2011, 20:46:18

3 ответа


72

Проверяется только, существует ли файл cookie, не очень строгая защита.

Чтобы получить более сильную защиту, вы можете передать или «проксировать» все запросы в загруженную папку (примерный uploads в следующем примере) через скрипт php:

RewriteCond% {REQUEST_FILENAME} -s
RewriteRule ^ wp-content /uploads /(.*)$ dl-file.php? File = $ 1 [QSA, L]

Все запросы к загруженным файлам (включая изображения в сообщениях) будут отправляться в dl-file.php, который затем может проверить, вошел ли пользователь в систему или нет.

Если пользователь не войдет в систему, будет показана форма входа в ваш сайт. После того, как пользователь войдет в систему, она будет перенаправлена ​​обратно в файл и может загрузить его сейчас.

Иллюстративный dl-file.php .

Нечто похожее можно найти в \ wp-includes \ ms-files.php в вашей установке wordpress, но это одно для многосайтового и без проверки входа и перенаправления.

В зависимости от того, сколько трафика у вас есть, было бы разумно лучше интегрировать это с вашим сервером, например. Заголовки X-Accel-Redirect или X-Sendfile.

ответил hakre 3 Jam1000000amTue, 03 Jan 2012 01:50:59 +040012 2012, 01:50:59
14

Вы также можете написать плагин с помощью init и get-value $ _ GET ['file'];. Если у пользователя есть это значение get-value, перейдите в функцию, чтобы проверить права доступа к файлам: например, с флажком в мета-окне.

add_action ('init', 'fb_init');
функция fb_init () {
    //это в функции для init-hook
    if (''! = $ _GET ['file']) {
        fb_get_file ($ _GET ['файл']);
    }
}

функция get_file ()

function fb_get_file ($ file) {

    $ upload = wp_upload_dir ();
    $ the_file = $ file;
    $ file = $ upload ['basedir']. '/'. $ Файл;
    if (! is_file ($ file)) {
        status_header (404);
        die ('404 & # 8212; Файл не найден.');
    }
    else {
        $ image = get_posts (array ('post_type' => 'attachment', 'meta_query' => array (array ('key' = gt; '_wp_attached_file', 'value' => $ the_file))));
        if (0 <count ($ image) & & 0 <$ image [0] -> post_parent) {//добавлено вложение и доступно родителям
            if (post_password_required ($ image [0] -> post_parent)) {//пароль для сообщения не доступен
                wp_die (get_the_password_form ()); //показать форму пароля
            }
            $ status = get_post_meta ($ image [0] - gt; post_parent, '_inpsyde_protect_content', true);

            if (1 == $ status &! is_user_logged_in ()) {
                wp_redirect (wp_login_url ($ upload ['baseurl']. '/'. $ the_file));
                умереть();
            }
        }
        else {
            //не обычная проверка вложений для эскиза
            $ filename = pathinfo ($ the_file);
            $ images = get_posts (array ('post_type' => 'attachment', 'meta_query' => array (array ('key' => '_wp_attachment_metadata', 'compare' => 'LIKE', 'value' => $ filename ['filename']. '.'. $ filename ['extension']))));
            если (0 <count ($ images)) {
                foreach ($ images as $ SINGLEIMAGE) {
                    $ meta = wp_get_attachment_metadata ($ SINGLEimage -> ID);
                    if (0 <count ($ meta ['sizes'])) {
                        $ filepath = pathinfo ($ meta ['file']);
                        if ($ filepath ['dirname'] == $ filename ['dirname']) {//текущий путь эскиза
                            foreach ($ meta ['размеры'] как $ SINGLEsize) {
                                if ($ filename ['filename']. '.'. $ filename ['extension'] == $ SINGLEsize ['file']) {
                                    if (post_password_required ($ SINGLEimage -> post_parent)) {//пароль для сообщения недоступен
                                        wp_die (get_the_password_form ()); //показать форму пароля
                                    }
                                    умереть ( 'Dd');
                                    $ status = get_post_meta ($ SINGLEimage -> post_parent, '_inpsyde_protect_content', true);

                                    if (1 == $ status &! is_user_logged_in ()) {
                                        wp_redirect (wp_login_url ($ upload ['baseurl']. '/'. $ the_file));
                                        умереть();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    $ mime = wp_check_filetype ($ file);

    if (false === $ mime ['type'] & & function_exists ('mime_content_type'))
        $ mime ['type'] = mime_content_type ($ file);

    if ($ mime ['type'])
        $ mimetype = $ mime ['type'];
    еще
        $ mimetype = 'image /'. substr ($ file, strrpos ($ file, '.') + 1);

    header ('Content-type:'. $ mimetype); //всегда отправляем это
    if (false === strpos ($ _SERVER ['SERVER_SOFTWARE'], 'Microsoft-IIS'))
        header ('Content-Length:'. filesize ($ file));

    $ last_modified = gmdate ('D, d M Y H: i: s', filemtime ($ file));
    $ etag = '"'. md5 ($ last_modified). '' ';
    header («Last-Modified: $ last_modified GMT»);
    header ('ETag:'. $ etag);
    header ('Expires:'. gmdate ('D, d M Y H: i: s', time () + 100000000). 'GMT');

    //Поддержка условного GET
    $ client_etag = isset ($ _SERVER ['HTTP_IF_NONE_MATCH])? stripslashes ($ _SERVER ['HTTP_IF_NONE_MATCH']): false;

    if (! isset ($ _SERVER ['HTTP_IF_MODIFIED_SINCE']))
        $ _SERVER ['HTTP_IF_MODIFIED_SINCE'] = false;

    $ client_last_modified = trim ($ _SERVER ['HTTP_IF_MODIFIED_SINCE']);
    //Если строка пуста, верните 0. Если нет, попытайтесь проанализировать временную метку
    $ client_modified_timestamp = $ client_last_modified? strtotime ($ client_last_modified): 0;

    //Создаем временную метку для нашей последней модификации ...
    $ modified_timestamp = strtotime ($ last_modified);

    if (($ client_last_modified & & $ client_etag)? (($ client_modified_timestamp> = $ modified_timestamp) & & ($ client_etag == $ etag))
        : (($ client_modified_timestamp> = $ modified_timestamp) || ($ client_etag == $ etag))
        ) {
        status_header (304);
        Выход;
    }

    //Если мы сделали это так далеко, просто подайте файл
    readfile ($ file);
    умереть();
}

Вы также можете добавить собственный URL-адрес для файлов через hook generate_rewrite_rules

add_filter ('generate_rewrite_rules', 'fb_generate_rewrite_rules');

функция fb_generate_rewrite_rules ($ wprewrite) {
        $ upload = wp_upload_dir ();
        $ path = str_replace (site_url ('/'), '', $ upload ['baseurl']);
        $ wprewrite -> non_wp_rules = array ($ path. '/(.*)' => 'index.php? file = $ 1');
        return $ wprewrite;
}
ответил bueltge 3 Jpm1000000pmTue, 03 Jan 2012 14:20:25 +040012 2012, 14:20:25
1

Если вы хотите использовать подход, основанный на плагинах, для решения этой проблемы, вот достаточно хорошее решение, которое я нашел (наконец):

  1. Установите плагин «Монитор загрузки», доступный по адресу:
    https: //wordpress. org /plugins /download-monitor /
  2. В WordPress Dashboard перейдите к новому пункту меню «Загрузки» и добавьте новый «Загрузка», как описано в документации к плагину здесь: https://www.download-monitor.com/kb/adding- загрузки /. Обратите внимание на короткий код «Загрузить» для вас (например, сохранить в Блокнот). Обратите внимание, что файл сохраняется в /wp-content /uploads /dlm_uploads /
  3. В «метаданных параметров загрузки» укажите «Только члены» (как описано здесь https://www.download-monitor.com/kb/download-options/) и нажмите «Опубликовать».
  4. На странице, которую вы хотите, чтобы участники загружались только для загрузки, добавьте в короткий код, который вы отметили на шаге №2, и «Публикация /обновление» страницы, как описано здесь: https://www.download-monitor.com/kb/shortcode-download/. Вы можете изменить шаблон ссылки для загрузки, как описано здесь https: //www.download-monitor .com /kb /content-templates / или создайте свой собственный (например, чтобы удалить счетчик загрузки)
  5. Перейдите на свою страницу, вы увидите ссылку для загрузки (но не показывающую URL-адрес файла загрузки). Если вы перейдете на ту же страницу в новом окне браузера (или в окне инкогнито), вы должны обнаружить, что загрузка больше не работает.

Это означает, что любой, кто не вошел в систему, не может загрузить файл или увидеть реальный URL-адрес файла. Если в случае, если кто-то несанкционирован указывает URL-адрес файла, плагин также запрещает пользователям просматривать настоящий URL-адрес файла, блокируя доступ к папке /wp-content /uploads /dlm_uploads /.

Бонус: если вы делаете это для сайта, где вам нужно, чтобы пользователи могли войти в систему только как «Участники» (но не имеют никаких разрешений WordPress, таких как редактирование страниц или администратор), установите плагин «Members» https://wordpress.org/plugins/members/, создайте новую роль пользователя под названием «Member», и дать ему единственную возможность «читать», создать нового пользователя в WordPress и не заставлять их играть роль «Member».

Если вы хотите защитить содержимое страниц, плагин «Members» предоставляет некоторые параметры или есть другие плагины. Если вы хотите указать страницу входа в систему для стран-членов, чтобы выглядеть лучше, чем форма входа в систему WordPress, используйте что-то вроде «Theme My Login»: https://wordpress.org/plugins/theme-my-login/

ответил Matty J 13 PMpThu, 13 Apr 2017 12:09:36 +030009Thursday 2017, 12:09:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132