защита файлов путем создания ссылок с ограниченным жизненным циклом с помощью Spatie URL-Signer

Я разрабатываю свой проект с использованием Laravel (ocotber CMS) и использую Spatie URL Signer пакет для защиты моих файлов с ограниченными ссылками жизни. Я загружаю свой файл в защищенный каталог, занесенный в черный список .htaccess файл.

мой .htaccess:
RewriteRule ^storage/app/uploads/protected/.* index.php [L,NC]

мой файл загружен в:
/storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf

код, который генерирует ссылку с датой истечения срока действия:
UrlSigner::sign('http://localhost:8888/storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf');

сгенерированная ссылка выглядит так:
http://localhost:8888/storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf?expires=1488905432&signature=fd82b06725096b8e6c43221a9616e420

Также я добавил код обработки маршрута, который использует промежуточное ПО пакета для защиты ссылок.
Route::get('protected-route', ['middleware' => 'signedurl', function () {
return 'Hello secret world!';
}]);

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

3

Решение

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

Маршруты:

// set up a route group with your signedurl middleware
Route::group(['middleware' => 'signedurl'], function () {
// create a new route which references a controller
// the {path} is the location of the file
// so your URLs would look something like
// http://localhost:8888/media/storage/app/uploads/protected/58b/d45/789/58bd457897aab778152349.pdf
Route::get('media/{path}', 'MediaController@getPrivateFile');
// you can also do some validation using
// ->where('path', '.*?');
});

Тогда в вашем новом контроллере:

class MediaController extends Controller
{
public function getPrivateFile(Request $request, $pathToFile)
{
// check if file exists
// if (file_exists) {
//     # code...
// }
return response()->download($pathToFile);
}
}

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]