利用Cloudflare Worker来解决渣浪图床来源验证问题

2023 年 3 月 6 日 星期一(已编辑)
18

利用Cloudflare Worker来解决渣浪图床来源验证问题

2023.1.28号,Cloudflare疑似单方面限制使用fetch抓取信息,可能已经失效

喜报,tmd,某浪图床又上了神奇的403问题,如果你的图片使用了这家的图床,那么又炸了(


sinaIMGBrokenAGAIN

sinaIMGBrokenAGAIN

按理说和几年前的操作是一模一样的,加了来源验证,也就是referer白名单机制,本站的cdn也使用了此服务

不过,因为是referer白名单,那一定有某浪本源的验证机制,那么我们就可以利用某些神奇的东西,让某浪误认为来源就是“某浪”,不就好了吗(

不过简单的提醒一下,防盗链的方法其实有很多,建议非必要不要去使用此家图片库作为自己的唯一图床,可以使用一些类似于smms的服务作为备用,以防哪一天来了个没法解决的方案。

实际成图

result

result

如果只是简单的图库使用,可以使用自家的反代服务作为临时的替代品,建议自行搭建 本家服务地址 :"Simg.himoyo.cn" 可以替换掉目前已经炸掉的图库,不过此服务不保证长期运行,仅作为临时替代

搭建方法 ---- 好哦,咱们来到搭建的方法了 () 这篇教程主要还是教如何搭建类似的反代服务的哦,虽然文章内容上是利用cfworker解决图床问题,不过此方法也适合搭建一些例如github临时访问的反代服务,你也可以通过nginx的反代达到目的,或许效果更好一些(

好了哦,首先我们需要在cloudflare上有个账户,同时提醒一下需要有一个自己的域名,本身cf自带的服务链接貌似是无法访问的。

因为是使用cloudflare的服务,需要将域名解析到cloudflare才可以哦w,如果不想整个服务接入到Cloudflare,或许你可以考虑Cloudflare Partner项目,可能会有一些的免费DNS解析是活着的,在2021年貌似被收回了不少

或许你可以找到可以使用的服务,并作为dns的接入方案,貌似最常见的做法是使用 DNSpod + Cloudflare + 百度云加速,咱第一个网站貌似就是这样干的,国内百度云加速国外Cloudflare,效果貌似还可以w

因为咱文章不是0基础教程,所以有一些很简单有手就行的操作就不会在本文章写了,因为咱很懒,你知道嘛,咱图床都是上传到另一个存储,然后复制地址到本页面引用的,所以我很懒哦x目前就当做你已经将Cloudflare注册好+已经做好解析了

首先呢,你需要创建一个Cloudflare Worker的项目,如下图所示

1

1
2

2
3

3
4

4

按上图所示后,复制下列代码 ``` // Replace Link const upstream = 'tva1.sinaimg.cn'

// Mobile Link if necessary <( const upstream_mobile = 'tva1.sinaimg.cn'

// Blocked Country const blocked_region = ['RU']

// Forbide Self. const blocked_ip_address = ['0.0.0.0', '127.0.0.1']

// Replace Link. const replace_dict = { 'upstream:upstream': 'custom_domain', '//tva1.sinaimg.cn': '' }

addEventListener('fetch', event => { event.respondWith(fetchAndApply(event.request)); })

async function fetchAndApply(request) {

const region = request.headers.get('cf-ipcountry').toUpperCase();
const ip_address = request.headers.get('cf-connecting-ip');
const user_agent = request.headers.get('user-agent');
 
let response = null; let url = new URL(request.url); let url_host = url.host; if (url.protocol == 'http:') { url.protocol = 'https:' response = Response.redirect(url.href); return response; } if (await device_status(user_agent)) { upstream_domain = upstream } else { upstream_domain = upstream_mobile } url.host = upstream_domain; if (blocked_region.includes(region)) { response = new Response('Access denied: WorkersProxy is not available in your region yet.', { status: 403 }); } else if(blocked_ip_address.includes(ip_address)){ response = new Response('Access denied: Your IP address is blocked by WorkersProxy.', { status: 403 }); } else{ let method = request.method; let request_headers = request.headers; let new_request_headers = new Headers(request_headers); new_request_headers.set('Host', upstream_domain); new_request_headers.set('Referer', url.href); let original_response = await fetch(url.href, { method: method, headers: new_request_headers }) let original_response_clone = original_response.clone(); let original_text = null; let response_headers = original_response.headers; let new_response_headers = new Headers(response_headers); let status = original_response.status; new_response_headers.set('access-control-allow-origin', '*'); new_response_headers.set('access-control-allow-credentials', true); new_response_headers.delete('content-security-policy'); new_response_headers.delete('content-security-policy-report-only'); new_response_headers.delete('clear-site-data'); const content_type = new_response_headers.get('content-type'); if (content_type.includes('text/html') && content_type.includes('UTF-8')) { original_text = await replace_response_text(original_response_clone, upstream_domain, url_host); } else { original_text = original_response_clone.body } response = new Response(original_text, { status, headers: new_response_headers }) } return response;

}

async function replace_response_text(response, upstream_domain, host_name) { let text = await response.text()

var i, j;
for (i in replace_dict) {
    j = replace_dict[i]
    if (i == '$upstream') {
        i = upstream_domain
    } else if (i == '$custom_domain') {
        i = host_name
    }
 
    
if (j == 'upstream)j=upstreamdomainelseif(j==upstream') { j = upstream_domain } else if (j == 'custom_domain') { j = host_name } let re = new RegExp(i, 'g') text = text.replace(re, j); } return text;

}

async function device_status (user_agent_info) { var agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; var flag = true; for (var v = 0; v < agents.length; v++) { if (user_agent_info.indexOf(agents[v]) > 0) { flag = false; break; } } return flag; } ``` 这一部分也可以作为反代的服务代码,或许你可以通过替换成github的链接以达到访问github的方案。 保存后呢,在

1

1
的 “添加路由”后,可以如下配置
10

10
域名换成你想要的域名即可,其中最后的 “/*” 是需要保留的,请勿删除,其他类似即可 最后呢,你需要配置好相关的DNS服务,即在Cloudflare的DNS配置,设置如下即可
cf6

cf6
其中 simg 是你二级域名的配置,例如,xxx.himoyo.cn 要可以访问的话,可以在前面写入 xxx 即可,其余不动 如果一切顺利的话,那么服务就完整搭建好了。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...