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

Я использую 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/