php - 如何保护 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);
}
}
我做错了什么以及如何使它起作用?
请注意,这实际上有效,但前提是我删除了验证部分,否则我得到签名无效。
解决方案
好吧,经过几个小时的挫折,我终于找到了。
显然我到目前为止所做的事情是正确的,唯一的例外是在 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);
为动态的,但这只是一个演示。
推荐阅读
- c - 我需要帮助来修改 pnscan
- vuetify.js - 以 vuelidate 或任何其他方式验证日期
- reactjs - createPortal 不会覆盖 div 内容(如 ReactDOM.render)
- sql - 创建程序,仅当学生有足够的余额时才允许他们注册课程
- android - 主线程在 CompletabeObserver 被调用之前结束
- python-3.x - 停止 rabitmq 进程和队列后,Rabbitmq 保留请求
- java - Map reduce 作业执行但不产生输出
- c# - ASP.NET Core MVC 2.1:不使用 Javascript 触发按钮事件
- android - TextView doesn't work correctly - why so?
- postgresql - Firebase 函数在连接到 Google Cloud Sql 时引发 TimeoutError