Intereting Posts
«username_exists» все еще возвращает идентификатор даже после удаления записи из базы данных? Установите WP_MAX_MEMORY_LIMIT выше, чем PHP.ini memory_limit Форма, которая отправляет данные на панель администратора и может экспортировать ее Такая же таксономия для разных типов объектов Получить путь к другому плагину StoreFront WordPress theme: Как я могу создать новую домашнюю страницу с настраиваемым дизайном так же, как шаблон Добавление короткого кода внутри Visual Composer raw HTML Как сделать переменную доступной для продолжительности запроса страницы Как сравнить две должности, включая их метаполя на масштабируемой основе? Обновление URL-адресов совместного использования eXtended для перетаскивания? показать список последних комментариев для каждого сообщения в цикле Белый экран смерти для wp-admin и ошибка для wp-login.php после ввода учетных данных Загрузка файлов в wp-content / uploads – Что добавить в БД? Вернуться теги сообщения с описанием Нет сообщений для отображения – Custom Post Type show_ui

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

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

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

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

Я нашел плагин, называемый частными файлами, но последний раз обновлялся в 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] </IfModule> # END WordPress 

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

Solutions Collecting From Web of "Как защитить загрузки, если пользователь не зашел в систему?"

Только проверка наличия файла 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 .

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

 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 { // not a normal attachment check for thumbnail $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' ] ) {// current path of the thumbnail foreach ( $meta[ 'sizes' ] as $SINGLEsize ) { if ( $filename[ 'filename' ] . '.' . $filename[ 'extension' ] == $SINGLEsize[ 'file' ] ) { if ( post_password_required( $SINGLEimage -> post_parent ) ) { // password for the post is not available wp_die( get_the_password_form() );// show 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 MYH:i:s', filemtime( $file ) ); $etag = '"' . md5( $last_modified ) . '"'; header( "Last-Modified: $last_modified GMT" ); header( 'ETag: ' . $etag ); header( 'Expires: ' . gmdate( 'D, d MYH:i:s', time() + 100000000 ) . ' GMT' ); // Support for Conditional 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'] ); // If string is empty, return 0. If not, attempt to parse into a timestamp $client_modified_timestamp = $client_last_modified ? strtotime( $client_last_modified ) : 0; // Make a timestamp for our most recent modification... $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; } // If we made it this far, just serve the file readfile( $file ); die(); } 

Вы также можете добавить собственный URL-адрес для файлов через hook 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; } 

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

  1. Установите плагин «Монитор загрузки», доступный по адресу:
    https://wordpress.org/plugins/download-monitor/
  2. В панели инструментов WordPress перейдите к новому пункту меню «Загрузки» и добавьте новый «Загрузка», как описано на веб-сайте документации плагина: https://www.download-monitor.com/kb/adding-downloads/ . Обратите внимание на короткий код «Загрузить» для вас (например, сохранить в Блокнот). Обратите внимание, что файл сохраняется в /wp-content/uploads/dlm_uploads/
  3. В разделе «Параметры загрузки» exchangeox укажите «Только члены» (как описано здесь 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/