首页 > 解决方案 > 如何保护 Laravel Glide 库?

问题描述

我已经将Glide安装到我的 laravel 应用程序中,并且我正在努力保护它免受 大规模图像调整大小攻击

但是我总是得到签名无效。

这是我在AppServiceProvider.php的设置

public function register()
{
    $this->app->singleton(Server::class, function($app) {

        $filesystem = $app->make("Illuminate\Contracts\Filesystem\Filesystem");

        return ServerFactory::create([
            'response' => new LaravelResponseFactory(app('request')),
            'source' => $filesystem->getDriver(),
            'cache' => $filesystem->getDriver(),
            'cache_path_prefix' => '.cache',
            'base_url' => 'img',
            'max_image_size' => 2000*2000,
        ]);

    });
}

ImageController.php我生成这样的 url

public static function thumbnailUrlBuilder($path) {

    $signkey = 'v-LK4WCdhcfcc%jt*VC2cj%nVpu+xQKvLUA%H86kRVk_4bgG8&CWM#k*b_7MUJpmTc=4GFmKFp7=K%67je-skxC5vz+r#xT?62tT?Aw%FtQ4Y3gvnwHTwqhxUh89wCa_';

    $urlBuilder = UrlBuilderFactory::create('/img/', $signkey);

    $url = $urlBuilder->getUrl($path, ["w" => 400, "h" => 400, "fit" => "crop"]);

    return $url;
}

最后这是我在ImageController.php中的显示功能,并进行了验证

public function show(Server $server, $path) {
    try {
        $signkey = 'v-LK4WCdhcfcc%jt*VC2cj%nVpu+xQKvLUA%H86kRVk_4bgG8&CWM#k*b_7MUJpmTc=4GFmKFp7=K%67je-skxC5vz+r#xT?62tT?Aw%FtQ4Y3gvnwHTwqhxUh89wCa_';

        SignatureFactory::create($signkey)->validateRequest($path, $_GET);

        $server->outputImage($path, $_GET);
    
    } catch (SignatureException $e) {
        dd($e);
    }
}

我做错了什么以及如何使它起作用?

请注意,这实际上有效,但前提是我删除了验证部分,否则我得到签名无效。

标签: phplaravel

解决方案


好吧,经过几个小时的挫折,我终于找到了。

显然我到目前为止所做的事情是正确的,唯一的例外是在 show 函数中$path传递给。SignatureFactory这需要实际的网址。在我的情况下,url 路径是这样的/img/storage/images/2020.11/031.jpg,我正在通过/storage/images/2020.11/031.jpg.

所以我改变了我的显示功能,如下面的代码示例,一切正常!

public function show(Server $server, $path) {
    try {
        $signkey = 'v-LK4WCdhcfcc%jt*VC2cj%nVpu+xQKvLUA%H86kRVk_4bgG8&CWM#k*b_7MUJpmTc=4GFmKFp7=K%67je-skxC5vz+r#xT?62tT?Aw%FtQ4Y3gvnwHTwqhxUh89wCa_';
        SignatureFactory::create($signkey)->validateRequest("/img/$path", $_GET);

        $server->outputImage($image, $_GET);
    
    } catch (SignatureException $e) {
        dd($e);
    }
}

当然我们可以改变->validateRequest("/img/$path", $_GET);为动态的,但这只是一个演示。


推荐阅读