PHP端 OSS 防盗链 + 签名URL
封面图
•
2025-11-08
•
PHP
176
3
0
0
在 PHP 端实现 **OSS 防盗链 + 签名 URL**,主要是为了防止他人直接通过链接访问你的 OSS(阿里云对象存储)资源,从而保护你的资源不被滥用。 --- ## ✅ 一、OSS 防盗链原理 ### 1. 防盗链(Referer) - 设置白名单:只有指定的域名(如 `example.com`)才能访问资源。 - 如果请求头中的 `Referer` 不在白名单中,则拒绝访问。 ### 2. 签名 URL(Signature) - 生成一个带签名的 URL,该 URL 在一定时间内有效。 - 即使别人知道这个 URL,也无法长期使用,因为过期后失效。 --- ## ✅ 二、PHP 实现 OSS 防盗链 + 签名 URL 的步骤 ### 1. 安装阿里云 SDK(推荐使用 `alibabacloud/oss-sdk-php`) ```bash composer require alibabacloud/oss-sdk-php ``` ### 2. 编写 PHP 代码生成带签名的 URL ```php <?php require 'vendor/autoload.php'; use AlibabaCloud\OSS\OSSClient; use AlibabaCloud\OSS\Models\CannedAclType; // 配置信息 $accessKeyId = 'your-access-key-id'; $accessKeySecret = 'your-access-key-secret'; $bucket = 'your-bucket-name'; $endpoint = 'oss-cn-beijing.aliyuncs.com'; // 根据你的 bucket 所在地域修改 // 要访问的文件路径(object key) $object = 'your-file.jpg'; // 设置签名 URL 的有效期(单位:秒) $expires = 3600; // 1小时 // 创建 OSS 客户端 $ossClient = new OSSClient([ 'accessKeyId' => $accessKeyId, 'accessKeySecret' => $accessKeySecret, 'endpoint' => $endpoint, ]); // 生成带签名的 URL $signedUrl = $ossClient->signUrl($bucket, $object, $expires); echo "Signed URL: " . $signedUrl; ``` --- ## ✅ 三、设置 OSS 防盗链(Referer) ### 1. 登录阿里云控制台 → OSS 控制台 → 选择 Bucket → 安全设置 → 防盗链设置 ### 2. 设置 Referer 白名单 - 开启防盗链开关 - 添加允许的 Referer 域名(例如:`example.com`、`*.example.com`) - 可选:是否允许空 Referer(即用户直接输入 URL 访问) > 注意:如果设置了防盗链,那么 **非白名单的 Referer 将无法访问资源**,即使有签名 URL 也可能被拦截。 --- ## ✅ 四、签名 URL 与防盗链的关系 | 情况 | 是否能访问 | |------|------------| | 无签名 URL,且未设置防盗链 | 可以访问 | | 有签名 URL,但未设置防盗链 | 可以访问 | | 有签名 URL,且设置了防盗链 | 若签名 URL 是由 OSS SDK 生成,并且正确配置了签名算法,则可以访问 | | 无签名 URL,但设置了防盗链 | 不能访问(除非 Referer 合法) | --- ## ✅ 五、注意事项 - 签名 URL 的生成必须使用正确的 AccessKey 和 Secret。 - 签名 URL 会暴露在前端,所以要控制好有效期和权限。 - 如果你同时使用防盗链和签名 URL,确保签名 URL 是合法的,否则会被防盗链拦截。 --- ## ✅ 六、完整示例(包含防盗链设置) 如果你希望 **签名 URL 也经过防盗链验证**,则需要: 1. 在 OSS 控制台设置防盗链(Referer 白名单)。 2. 使用 SDK 生成签名 URL。 这样,只有在签名 URL 有效期内,且 Referer 符合白名单的请求,才会被允许访问。 --- ## ✅ 七、扩展:如何验证签名 URL? 你可以使用以下方式验证签名 URL 的合法性: ```php // 使用 SDK 验证签名 URL(仅用于调试) $ossClient->verifyUrl($signedUrl); ``` --- ## ✅ 八、常见问题 ### Q: 为什么签名 URL 无法访问? - 检查签名是否正确(SDK 生成的 URL 应该是正确的) - 检查防盗链设置是否允许当前域名 - 检查时间戳是否在有效期内(签名 URL 有时间限制) ### Q: 如何避免签名 URL 泄露? - 使用临时 AccessKey 或 RAM 子账号 - 控制签名 URL 的有效期 - 不将签名 URL 直接暴露在前端页面中 --- 如果你有具体的业务场景(比如上传、下载、预览等),我可以帮你进一步优化方案。欢迎继续提问!
上一篇:
发行加密货币要掌握那些知识?
下一篇:
Flutter开发框架介绍
标题录入,一次不能超过6条
留言
评论