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

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

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

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

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

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

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

# 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]
</IfModule>
# END WordPress

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

Понравился вопрос? Нужен ответ? Поддержите проект
WPAsk
Ответов: 3
  1. bueltge

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

    add_action( 'init', 'fb_init' );
    function fb_init() {
        // this in a function for init-hook
        if ( '' != $_GET[ 'file' ] ) {
            fb_get_file( $_GET[ 'file' ] );
        }
    }
    

    Функция get_file()

    function fb_get_file( $file ) {
    
        $upload     = wp_upload_dir();
        $the_file   = $file; 
        $file       = $upload[ 'basedir' ] . '/' . $file;
        if ( !is_file( $file ) ) {
            status_header( 404 );
            die( '404 &#8212; File not found.' );
        }
        else {
            $image = get_posts( array( 'post_type' => 'attachment', 'meta_query' => array( array( 'key' => '_wp_attached_file', 'value' => $the_file ) ) ) );
            if ( 0 < count( $image ) && 0 < $image[0] -> post_parent ) { // attachment found and parent available
                if ( post_password_required( $image[0] -> post_parent ) ) { // password for the post is not available
                    wp_die( get_the_password_form() );// show the password form 
                }
                $status = get_post_meta( $image[0] -> post_parent, '_inpsyde_protect_content', true );
    
                if ( 1 == $status &&  !is_user_logged_in() ) {
                    wp_redirect( wp_login_url( $upload[ 'baseurl' ] . '/' . $the_file ) );
                    die();
                }
            }
            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' ] ) ) ) );
                if ( 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[ 'sizes' ] as $SINGLEsize ) {
                                    if ( $filename[ 'filename' ] . '.' . $filename[ 'extension' ] == $SINGLEsize[ 'file' ] ) {
                                        if ( post_password_required( $SINGLEimage -> post_parent ) ) { // пароль для поста недоступен
                                            wp_die( get_the_password_form() );// показать форму пароля
                                        }
                                        die('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 ) );
                                            die();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        $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' ];
        else
            $mimetype = 'image/' . substr( $file, strrpos( $file, '.' ) + 1 );
    
        header( 'Content-type: ' . $mimetype ); // always send this
        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 );
            exit;
        }
    
        readfile( $file );
        die();
    }
    

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

    add_filter( 'generate_rewrite_rules', 'fb_generate_rewrite_rules' );
    
    function 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;
    }
    
  2. Matty J

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

    1. Установите плагин ‘Download Monitor’ (https://wordpress.org/plugins/download-monitor/)
    2. В панели управления WordPress перейдите в новый пункт меню «Загрузки» и добавьте новый «Загрузить», как описано в документации к плагину.
      Обратите внимание на предоставленный для вас шорткод «Скачать» (например, сохранить в Блокнот). Обратите внимание, что файл сохраняется в/wp-content/uploads/dlm_uploads/
    3. В ‘Загрузить настройки’ выберите ‘Только участники’и нажмите ‘Опубликовать’.
    4. На странице добавьте шорткод, который вы отметили на шаге 2, и нажмите ‘Обновить’
    5. Перейдите на свою страницу, вы должны увидеть ссылку для скачивания (но там не указан URL-адрес файла загрузки). Если вы перейдете на ту же страницу в новом окне браузера (или в окне Incognito), вы обнаружите, что загрузка больше не работает.

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

  3. hakre

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

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

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

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

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

Добавить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: