现在使用的开发框架是thinkPHP6
想实现类似 阿里云oss 文件存储的 防盗链功能。
就是比如 我在网站里面 上传了 一个 3.jpg \ 4.mp4 \ 5.rar 3个文件。
想实现这样的控制,比如 只有 3 。com bd .com 这个的域名请求才能访问。非允许的就拒绝访问。
如果各位朋友,刚好有做过类似的,或者有想法的,劳烦您的小手回复一下。谢谢了。
该回答内容部分引用GPT,GPT_Pro更好的解决问题
使用ThinkPHP 6实现OSS文件盗链控制,可以借助阿里云OSS的Referer白名单功能实现,该功能可以指定哪些Referer地址可以访问OSS中的文件。具体的步骤如下:
在thinkPHP 6应用中安装阿里云OSS SDK,用来调用阿里云OSS的API。
创建阿里云OSS存储空间,并上传文件。
使用阿里云OSS SDK调用putBucketReferer API设置Referer白名单,将允许访问的域名添加到白名单中。
在应用中使用getObject API来获取文件,如果当前请求的Referer不在白名单中,则会返回403 Forbidden。
以下是使用ThinkPHP 6实现OSS文件盗链控制的代码示例:
// 引入阿里云OSS SDK
use OSS\Core\OssException;
use OSS\OssClient;
// 配置阿里云OSS的相关信息
$accessKeyId = "yourAccessKeyId"; // AccessKeyId
$accessKeySecret = "yourAccessKeySecret"; // AccessKeySecret
$endpoint = "yourEndpoint"; // 节点地址, 例如: oss-cn-hangzhou.aliyuncs.com
$bucket= "yourBucketName"; // Bucket名称
// 创建OssClient实例
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
// 设置Referer白名单, 允许3.com、bd.com访问存储空间中的文件
$refererList = array('http://3.com', 'http://bd.com'); // 白名单列表
$allowEmptyReferer = false; // 是否允许空Referer, 默认不允许
try {
$ossClient->putBucketReferer($bucket, $refererList, $allowEmptyReferer);
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
// 获取文件, Referer不在白名单中则返回403 Forbidden
try {
$content = $ossClient->getObject($bucket, $object);
} catch (OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return;
}
print(__FUNCTION__ . ": OK" . "\n");
如果回答有帮助,望采纳。
该回答引用ChatGPT
在 ThinkPHP 6 中,您可以使用中间件(Middleware)来实现防盗链功能。中间件可以对请求进行预处理,包括对请求头和请求参数进行检查和修改,从而实现授权、限制访问等功能。
下面是一个基于中间件的防盗链实现示例:
1、创建一个防盗链中间件,例如 AntiLeechMiddleware.php:
<?php
namespace app\middleware;
class AntiLeechMiddleware
{
public function handle($request, \Closure $next)
{
$referer = $request->header('referer');
$allowed_domains = ['3.com', 'bd.com'];
$domain = parse_url($referer, PHP_URL_HOST);
if (in_array($domain, $allowed_domains)) {
return $next($request);
} else {
return response('Unauthorized', 401);
}
}
}
这个中间件会检查请求的 Referer 头部,如果请求来自允许的域名,则继续处理请求;否则返回 401 状态码,拒绝访问。
2、在路由中注册中间件:
您需要在路由中定义需要使用该中间件的路由,并在路由定义时注册中间件。
例如,如果您的上传文件的路由为 /upload,可以在路由定义时使用 middleware() 方法注册中间件,如下所示:
use app\middleware\AntiLeechMiddleware;
Route::post('/upload', 'IndexController@upload')
->middleware(AntiLeechMiddleware::class);
这个路由定义会将 AntiLeechMiddleware 中间件应用于 /upload 路由。每次访问 /upload 时,都会先执行中间件的 handle 方法进行防盗链检查。
这个示例只是一个简单的实现示例,您可以根据实际需要对中间件进行更复杂的配置和修改,例如读取配置文件、从数据库获取允许的域名列表等。
另外,需要注意的是,使用 Referer 头部进行防盗链可能不是绝对可靠的,因为 Referer 头部可以被伪造。如果您需要更可靠的防盗链控制,建议使用更安全的方法,例如使用签名、Token 等方式对请求进行认证。
加权限控制,比如在文件表里加个可访问域名的字段,用json格式或者多个域名之间用符号分隔,然后访问的时候判断域名存不存在字段里面