防盗链的一种绕过方案
我曾以为无解的防盗链问题,其实可以通过 Cloudflare Worker 绕过,今天实践了一下,确实可以绕过跨域和源站校验的问题:
// 配置目标网站
const TARGET_URL = 'https://www.example.com'; // ⚠️ 替换为你要代理的网站地址
export default {
async fetch(request, env, ctx) {
const url = new URL(request.url);
// 构建目标 URL,保留原始请求路径
const targetUrl = TARGET_URL + url.pathname + url.search;
// 创建一个新 Headers 对象,复制原始请求头
const newHeaders = new Headers(request.headers);
// --- 在这里添加伪装的关键代码 ---
// 1. 修改或添加 Origin 和 Referer
newHeaders.set('Origin', TARGET_URL);
newHeaders.set('Referer', TARGET_URL);
// 2. 伪装一个常见的 User-Agent
newHeaders.set('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
// 3. 删除可能暴露真实访问来源的 Headers
newHeaders.delete('Referer'); // 确保我们上面新设的生效
newHeaders.delete('Origin'); // 确保我们上面新设的生效
newHeaders.delete('CF-Connecting-IP');
newHeaders.delete('CF-IPCountry');
newHeaders.delete('CF-Ray');
newHeaders.delete('CF-Visitor');
newHeaders.delete('CDN-Loop');
newHeaders.delete('X-Forwarded-For');
// 构建新的请求
const proxyRequest = new Request(targetUrl, {
method: request.method,
headers: newHeaders,
body: request.body,
redirect: 'follow',
});
// 发起真正的请求
const response = await fetch(proxyRequest);
// 处理响应,添加跨域头以支持在不同源上使用
const modifiedResponse = new Response(response.body, response);
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
// 移除可能导致问题的安全策略头
modifiedResponse.headers.delete('Content-Security-Policy');
modifiedResponse.headers.delete('X-Frame-Options');
return modifiedResponse;
}
}
当然,有法律风险和道德争议,仅供学习参考。