Подтвердить что ты не робот

Как защитить изображение от общественного мнения в Laravel 5?

Я установил Laravel 5.0 и сделал аутентификацию. Все работает отлично.

Мой веб-сайт доступен только для пользователей, прошедших проверку подлинности. Содержимое внутри защищено только для пользователей, прошедших проверку подлинности, но изображения внутри сайта не защищены для общедоступного представления.

Любой, кто пишет URL-адрес изображения, может видеть изображение, даже если человек не вошел в систему.

http://www.somedomainname.net/images/users/userImage.jpg

Мой вопрос: можно защитить изображения (пример вышеприведенного URL) из общедоступного представления, в другом Word, если URL-адрес изображения отправляется кому-либо, человек должен быть членом и логином чтобы видеть изображение.

Это возможно и как?

4b9b3361

Ответ 1

В папке Laravel 5.x можно защитить изображения из общедоступного представления.

  • Создайте папку images в папке storage (я выбрал папку storage, поскольку она уже имеет разрешение на запись, которую я могу использовать, когда я загружаю на нее изображения) в Laravel, например storage/app/images.

  • Переместите изображения, которые вы хотите защитить из общей папки, в новую созданную папку images. Вы также можете выбрать другое место для создания папки images, но не в общей папке, но в структуре папок Laravel, но все же логический пример местоположения не внутри папки контроллера. Затем вам нужно создать контроллер маршрута и изображения.

Создать маршрут

Route::get('images/users/{user_id}/{slug}', [
     'as'         => 'images.show',
     'uses'       => '[email protected]',
     'middleware' => 'auth',
]);

Маршрут переадресует все запросы на получение изображения на страницу аутентификации, если человек не вошел в систему.

Создать ImagesController

class ImagesController extends Controller {

    public function show($user_id, $slug)
    {
        $storagePath = storage_path('app/images/users/' . $user_id . '/' . $slug);
        return Image::make($storagePath)->response();
    }
}

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

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

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


Дополнение: кто-то спросил, можно ли использовать этот метод как альтернативу загрузке общих папок, ДА это возможно, но это не рекомендуется, как описано в этом ответ. Таким образом, один и тот же метод можно также использовать для загрузки изображений в путь хранения, даже если вы не собираетесь их защищать, просто следуйте одному и тому же процессу, но удалите 'middleware' => 'auth',. Таким образом, вы не дадите разрешение 777 в своей общей папке и все еще имеете безопасную среду для загрузки. Тот же упомянутый answer также объясняет, как использовать этот метод без аутентификации, если кто-то его использовал или предоставил альтернативное решение.

Ответ 2

Я на самом деле не пробовал это, но нашел Nginx auth_request модуль, который позволяет проверить аутентификацию у Laravel, но все равно отправить файл с помощью Nginx.

Он отправляет внутренний запрос на указанный URL-адрес и проверяет http-код для успеха (2xx) или сбой (4xx) и при успехе, позволяет пользователю загружать файл.

Изменить: Еще один вариант - это то, что я пробовал, и, похоже, он работает нормально. Вы можете использовать X-Accel-Redirect -header для обслуживания файла от Nginx. Запрос проходит через PHP, но вместо отправки всего файла он просто отправляет местоположение файла в Nginx, который затем отправляет его клиенту.

Ответ 3

В предыдущем проекте я защищал загрузки, выполняя следующие действия:

Создан диск хранения:

config/filesystems.php
'myDisk' => [
        'driver' => 'local',
        'root' => storage_path('app/uploads'),
        'url' => env('APP_URL') . '/storage',
        'visibility' => 'private',
    ],

Это позволит загрузить файлы в \storage\app\uploads\ который не доступен для публичного просмотра.

Чтобы сохранить файлы на вашем контроллере:

Storage::disk('myDisk')->put('/ANY FOLDER NAME/' . $file, $data);

Для того, чтобы пользователи могли просматривать файлы и защищать загрузки от несанкционированного доступа. Сначала проверьте, если файл существует на диске:

public function returnFile($file)
{
    //This method will look for the file and get it from drive
    $path = storage_path('app/uploads/ANY FOLDER NAME/' . $file);
    try {
        $file = File::get($path);
        $type = File::mimeType($path);
        $response = Response::make($file, 200);
        $response->header("Content-Type", $type);
        return $response;
    } catch (FileNotFoundException $exception) {
        abort(404);
    }
}

Обслуживайте файл, если у пользователя есть права доступа:

 public function licenceFileShow($file)
{
    /**
     *Make sure the @param $file has a dot
     * Then check if the user has Admin Role. If true serve else
     */
    if (strpos($file, '.') !== false) {
        if (Auth::user()->hasAnyRole(['Admin'])) {
            /** Serve the file for the Admin*/
            return $this->returnFile($file);
        } else {
            /**Logic to check if the request is from file owner**/
            return $this->returnFile($file);
        }
    } else {
//Invalid file name given
        return redirect()->route('home');
    }
}

Наконец на маршрутах Web.php:

Route::get('uploads/user-files/{filename}', '[email protected]');