wpcorp.ru wordpress WP Corp

WooCommerce: как разрешить загрузку файлов только для авторизованных пользователей

Диагностика проблемы: почему важно ограничить загрузку файлов

В интернет-магазинах на WooCommerce часто возникает задача ограничить загрузку цифровых товаров или загрузку пользовательских файлов только для авторизованных пользователей. Без таких ограничений файл могут загружать и незарегистрированные посетители, что ведёт к потере контроля над контентом и риску утечки.

Типичные признаки проблемы:

  • Файлы доступны по прямым URL без проверки прав.
  • Пользователи без входа в систему могут скачать или загрузить файлы.
  • Уязвимость к массовым неавторизованным загрузкам, что создаёт нагрузку на сервер.

Пошаговое решение: ограничиваем загрузку файлов в WooCommerce

1. Проверка текущей реализации загрузки

В первую очередь необходимо понять, как именно реализована загрузка файлов: через стандартный функционал WooCommerce, кастомные формы или плагины. Обычно для загрузки файлов в заказе используется поле file в форме или мета-поле в заказе.

2. Добавление проверки авторизации перед загрузкой

Предположим, что загрузка происходит через AJAX-обработчик или кастомный PHP-скрипт. Нужно добавить проверку, что пользователь вошёл в систему, используя функцию is_user_logged_in().

add_action('wp_ajax_handle_file_upload', 'handle_file_upload_function');
function handle_file_upload_function() {
    if ( ! is_user_logged_in() ) {
        wp_send_json_error('Требуется авторизация для загрузки файлов');
        wp_die();
    }

    // Обработка загрузки файла
    if ( ! empty($_FILES['user_file']) ) {
        $uploaded = wp_handle_upload($_FILES['user_file'], ['test_form' => false]);
        if ( isset($uploaded['error']) ) {
            wp_send_json_error($uploaded['error']);
        } else {
            wp_send_json_success($uploaded['url']);
        }
    } else {
        wp_send_json_error('Файл не найден');
    }
    wp_die();
}

3. Ограничение прямого доступа к файлам

Если файлы хранятся в публичных директориях, можно предотвратить прямой доступ к ним без авторизации через .htaccess или через PHP-прокси.

Пример .htaccess для запрета доступа:

RewriteEngine On
RewriteCond %{REQUEST_URI} /wp-content/uploads/protected-files/
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in_.*$
RewriteRule ^ - [F]

Это правило запрещает доступ к папке protected-files, если нет куки авторизации WordPress.

4. Создание PHP-скрипта для проксирования загрузки

Альтернативный способ — хранить файлы вне публичной папки и отдавать через PHP с проверкой авторизации:

add_action('template_redirect', function() {
    if ( isset($_GET['download_protected_file']) ) {
        if ( ! is_user_logged_in() ) {
            wp_die('Требуется вход в систему для скачивания файла');
        }

        $file = sanitize_text_field($_GET['download_protected_file']);
        $file_path = WP_CONTENT_DIR . '/protected-files/' . $file;
        if ( file_exists($file_path) ) {
            header('Content-Disposition: attachment; filename="' . basename($file_path) . '"');
            header('Content-Type: application/octet-stream');
            readfile($file_path);
            exit;
        } else {
            wp_die('Файл не найден');
        }
    }
});

Проверка результата после внедрения

  • Откройте сайт в режиме инкогнито — попытка загрузки файла должна завершаться ошибкой авторизации.
  • Зайдите под учётной записью пользователя — загрузка должна работать корректно.
  • Проверьте через инструменты разработчика, что прямой доступ к защищённой папке запрещён.

Частые ошибки и их исправление

  • Отсутствие проверки в AJAX-обработчике — приводит к тому, что загрузка доступна всем. Решение: всегда проверяйте is_user_logged_in().
  • Файлы лежат в публичной папке без защиты — прямой доступ обходится URL. Решение: используйте .htaccess или храните файлы вне публичного каталога.
  • Неправильная обработка ошибок загрузки — пользователи не понимают причины отказа. Решение: возвращайте осмысленные сообщения об ошибках через JSON или на странице.
  • Неочищенные данные из GET/POST — риск XSS и уязвимостей. Решение: всегда используйте sanitize_text_field() и проверяйте типы данных.

Практические советы по безопасности и производительности

  • Используйте nonce-поля и проверку check_ajax_referer() для защиты AJAX-запросов.
  • Ограничьте типы и размер загружаемых файлов через параметры wp_handle_upload().
  • Для больших файлов реализуйте отслеживание прогресса загрузки, чтобы улучшить UX.
  • Кешируйте страницу загрузки, не кешируйте AJAX-запросы с проверкой авторизации.
  • Для комплексных задач рассмотрите плагины, например Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpcorp.ru&utm_medium=article&utm_campaign=woocommerce-razreshit-zagruzku-fajlov-tolko-dlya-avtorizovannyh-polzovatelej), который помогает с безопасностью и оптимизацией.

Сравнение вариантов реализации ограничения загрузок

МетодПлюсыМинусы
Проверка в AJAX-обработчикеПростота, гибкость, работает с кастомными формамиНужна разработка, можно забыть проверку
.htaccess защитаБыстрая защита на уровне сервераНе всегда подходит для динамической проверки
PHP-прокси для отдачи файловМаксимальный контроль и безопасностьНагрузка на PHP при больших файлах
Плагины безопасностиУдобство, дополнительные функцииМожет быть избыточно, нагрузка на сайт
×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙