如何在Laravel 5中保护图像不被公开查看?

13 浏览
0 Comments

如何在Laravel 5中保护图像不被公开查看?

我已安装了Laravel 5.0并进行了身份验证。一切都正常运行。

我的网站只对已验证的成员开放。网站内部的内容只对已验证的成员保护,但网站内的图片对公众是不受保护的。

任何人直接写入图片的URL都可以看到该图片,即使该人未登录系统。

我的问题:是否有可能保护图片(上述URL示例)不被公开查看,换句话说,如果将图片的URL发送给任何人,该人必须是会员并登录才能看到图片。

这是否可能,如何实现?

0
0 Comments

如何在Laravel 5中保护图像不被公开查看?

在Laravel中,有一种方法可以通过Nginx的auth_request模块来验证身份,同时仍然使用Nginx来发送文件。该模块会向给定的URL发送一个内部请求,并检查HTTP状态码以判断成功(2xx)或失败(4xx),如果成功,就允许用户下载文件。

另一种选项是使用X-Accel-Redirect头来从Nginx中提供文件。请求会经过PHP处理,但不会将整个文件传输给PHP,而是将文件位置发送给Nginx,然后由Nginx将文件提供给客户端。

这两种方法都可以有效保护图像文件不被公开查看。

0
0 Comments

在Laravel 5中如何保护图片不被公众查看?

在之前的项目中,我通过以下方式来保护上传的文件:

创建存储磁盘

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('/任意文件夹名称/' . $file, $data);

为了让用户查看文件并保护上传文件不受未经授权的访问,首先检查文件是否存在于磁盘上:

public function returnFile($file)
{
    //该方法将查找文件并从磁盘获取它
    $path = storage_path('app/uploads/任意文件夹名称/' . $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)
{
    /**
     *确保 $file 有一个点
     *然后检查用户是否具有管理员角色。如果为真,则提供,否则
     */
    if (strpos($file, '.') !== false) {
        if (Auth::user()->hasAnyRole(['Admin'])) {
            /** 为管理员提供文件*/
            return $this->returnFile($file);
        } else {
            /**检查请求是否来自文件所有者的逻辑**/
            return $this->returnFile($file);
        }
    } else {
        //给出无效的文件名
        return redirect()->route('home');
    }
}

最后在Web.php路由中设置:

Route::get('uploads/user-files/{filename}', 'MiscController');

0
0 Comments

在Laravel 5.x中,可以保护图像不被公开查看。首先,在Laravel中的storage文件夹下创建一个名为images的文件夹(选择storage文件夹是因为它已经具有写权限,可以在将图像上传到其中时使用),即storage/app/images。然后,将要保护的图像从公共文件夹移动到新创建的images文件夹。接下来,需要创建一个路由和图像控制器。

创建路由:

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

该路由将将所有图像请求访问转发到身份验证页面,如果用户未登录。

创建图像控制器:

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

对于使用Laravel 5.2及更高版本的用户,可以使用新的更好的文件响应方式。可以使用file方法直接在用户的浏览器中显示文件而不是下载。这种方式不会像之前的方式那样重新生成文件。示例如下:

return response()->file($pathToFile);
return response()->file($pathToFile, $headers);

可以根据自己的需求修改存储路径和文件/文件夹结构。还可以在控制器中添加条件,仅为特定成员显示图像。还可以对文件名进行哈希处理,使用文件名、时间戳和其他变量。

此方法也可以用作替代公共文件夹上传的方法,但不推荐这样做。如果要在存储路径中上传图像而不需要保护它们,只需按照相同的过程操作,但移除'middleware' => 'auth'。这样可以避免在公共文件夹中设置777权限,同时保持安全的上传环境。

总之,通过以上方法可以保护Laravel中的图像不被公开查看,并提供了不同的解决方案和注意事项。

0