前言概述
基础防盗链
基础防盗链主要是针对客户端请求过程中所携带的一些关键信息来验证请求的合法性, 比如客户端请求IP,请求URL中携带的referer。优点是规则简单,配置和使用都很方便,缺点是防盗链所依赖的验证信息很多都是可以伪造的,因此此类防盗链可靠性较低。
Referer防盗链
Referer在HTTP协议里有特殊的用途,当浏览器向服务器发送请求时,一般会带上Referer头,告知服务器该请求是从哪个页面链接过来的。Referer经常被用于页面访问统计、图片、流媒体防盗链等。
适用场景举例:
进入目标站点,打开开发者工具,定位到搜索背景,其是一个视频资源
使用浏览器直接访问这个视频:https://xiaochen-0101.oss-cn-beijing.aliyuncs.com/img/2023/05/feed7f1531256197c170749a4924b1e4.webm
回显报错:You are denied by bucket referer policy.(你被bucket referer策略拒绝。)
使用火狐浏览器拦截重发查看请求头 -> Referer: https://www.该站点域名/
PHP curl伪造Referer
<?php
// 要访问的OSS资源地址
$objectUrl = 'http://xiaochen-0101.oss-cn-beijing.aliyuncs.com/img/2023/05/feed7f1531256197c170749a4924b1e4.webm';
// 伪造的Referer值
$spoofedReferer = 'http://www.该站点域名/';
// 初始化cURL会话
$ch = curl_init($objectUrl);
// 设置cURL选项
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // 禁止自动跟随重定向
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Referer: ' . $spoofedReferer)); // 伪造Referer头部
// 执行cURL会话
$response = curl_exec($ch);
// 检查是否有错误发生
if (curl_errno($ch)) {
echo 'cURL error: ' . curl_error($ch);
} else {
// 输出获取到的内容
//echo $response;
// 确保只有客户端请求时,才输出流媒体数据
//session_start();
// 检查会话中是否有流媒体数据
if (isset($response)) {
// 设置必要的HTTP头信息以允许浏览器播放WebM
header('Content-Type: video/webm');
header('Content-Length: ' . strlen($response));
header('Accept-Ranges: bytes');
// 输出流媒体数据
echo $response;
// 如果需要,可以在这里清除会话中的流媒体数据
// unset($_SESSION['stream_data']);
} else {
// 如果没有流媒体数据,可以给出提示或者重定向
echo 'No stream data available.';
}
}
// 关闭cURL会话
curl_close($ch);
?>
添加Referer: https://www.该站点域名.com/ 之后就可以正常访问此资源
- 『零氪源码』—— “一个优质的源码资源平台!”
- 本文地址:https://www.lynkcode.com/pages/lynk/jiaocheng/guide-notes/191.html
- 本文标题:PHP curl伪造Referer突破服务端防盗链限制下载资源文件
- 本文版权:零氪源码 (www.lynkcode.com) » 所发布的内容,如无特别说明,转载请注明本文地址,如有侵权请联系我们!