Загрузка файлов с авторизацией пользователя NGINX и PHP +

Я пытаюсь настроить веб-службу, где пользователи могут загружать файлы. location / upload / { auth_request / auth ; ... } location = / auth { proxy_pass ... proxy_pass_request_body off ; proxy_set_header Содержимое - длина "" ; proxy_set_header X - Real - Ip $ remote_addr ; } перед выполнением любой аутентификации пользователя. Я хочу иметь возможность разрешать авторизованным пользователям загружать файлы.

В основном я хочу передать запрос на загрузку файла на PHP и заставить PHP сообщать NGINX, что этот пользователь действительно вошел в систему, и теперь он может получать от него файлы.

Я использую NGINX и PHP.

Какие-либо предложения?

php,nginx,

0

Ответов: 3


2 принят
+50

Использовать модуль запроса авторизации Nginx

Затем настройте свои директивы в Nginx примерно так:

if (isset($_SESSION['allowUpload']) {
    // OK
} else {
   // please login or you are not allowed to upload
}

Теперь Nginx будет делать внутренний подзапрос в / auth всякий раз, когда клиент запрашивает / закачивает, в этом примере передавая IP-адрес клиента в заголовках, но вы можете его настроить, но в соответствии с вашими потребностями.

Ваш PHP-скрипт получает подзапрос, делает любую аутентификацию, которую вы хотите сделать, и возвращает код ответа HTTP 200, если вы хотите разрешить доступ, и 401, если вы этого не сделали.


1

Один пример: используйте $ _SESSION, чтобы проверить, вошел ли пользователь в систему. Есть ли у вас фрагменты кода? Поскольку nginx работает под cgi / fastcgi, возможно, php-fpm, и, возможно, есть разные настройки, чтобы привлечь к нему внимание.

The only problem that I am having is that NGINX lets ANY user upload a file

1

Я думаю, что у вас есть некоторые промахи здесь ...

The only problem that I am having is that NGINX lets ANY user upload a file а также make PHP tell NGINX that ...

NGINX «только» служит для веб-страниц, является PHP, который (изнутри вашего сервера) позволяет пользователям загружать (или нет) файлы. Если вы (и все) можете загружать файлы на свой сервер, у вас есть серьезный риск для безопасности. Главное здесь - ограничить внешних пользователей прямой загрузкой любого файла в любую папку, а затем разрешить пользователям загружать файл (в папку, которую вы решили), через тип ввода = 'файл' (например).

Типичным сценарием будет:

Доступ пользователя к вашей веб-странице с формой загрузки файла. Они выбирают ( form) действительный файл и затем отправляют форму. Форма отправляет файл в файл PHP (upload.php) и этот магазин на ваш сервер:

Веб-страница -> форма -> upload.php -> сервер

Вы можете делать разные вещи, например:

  • Не позволяйте пользователям без регистрации доступа к ним form(они не могут загружаться)
  • Проверьте, upload.phpзарегистрирован ли пользователь ($ _SESSION). Это всегда нужно делать.
  • Оба они (мое одобрение)

Таким образом, невозможно, чтобы пользователь, не зарегистрированный на вашем сервере, мог загрузить на ваш сервер, потому что: - Отсутствие прямого разрешения на загрузку (ssh, sftp и т. Д.). Пользователи, которые хотят загрузить файл, должны перейти на вашу страницу формы. Если они не вошли в систему, перенаправляйте их на LOGIN.php. - Если кто-то попытается получить прямой доступ к upload.php, будет проверен с помощью $ _SESSION, чтобы узнать, зарегистрирован ли он или нет.

A (очень простой) пример

1 - HTML-форма:

<form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>

2 - Загрузить файл:

<?php
if(!User->isLogged()){  // or $_SESSION
   return false;        //or header('Location: login.php')
}
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File is an image - " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "File is not an image.";
        $uploadOk = 0;
    }
}
?>

Надеюсь, поможет!

PHP, Nginx,
Похожие вопросы
Яндекс.Метрика