【每周一文】破解图片防盗链入门教程

遇到问题

周末正在陪孩子完游戏,突然电话响起来,一看是武阳,有股想拉黒的冲动,自从上次帮他写了个追妹子的小程序后,丫的把我当成私人顾问了,所有与电脑相关的无关的问题都抛给我。上次半夜打电话问我,微信密码忘了,能不能让我帮他。

「有件事,你比较专业」

「我把公众号的文章 Copy 到我的博客里时,图片不显示,这是怎么回事?」

「怎么让图片正常显示呢?」

这件事,问得还比较靠谱,很多公众号运营应该也出现过这情况。

我们知道微信公众号图片是用 Referer 做了防盗链处理,知道 Referer 的原理,那么防盗链破解也就非常简单了。好在之前用 Readability 做内容抓取时写了个简单的 Referer 防盗链的代理,可以直接拿来用了。

扯淡

HTTP Referer 是 header 的一部分,当浏览器向 web 服务器发送请求的时候,一般会带上 Referer ,告诉服务器我是从哪个页面链接过来的,这个大家都知道,我就不多介绍,但这里面有个程序界比较有意思的小插曲,你可能不知道,我发出来,权当逗你一乐~

你有没有发现,在使用 Referer这个参数时,有时候是 Referer,而又的时候是 Referrer,这到底是怎么回事呢?

这就要谈到前端的发展,前端发展史中有很多有意思的东西,这里的 Referer 就是其中一个。

HTTP 协议中有一个用来表示页面或资源来源的请求头,由 Philip Hallam-Baker 于上世纪 90 年代提出来,他当时把这个请求头叫做 Referer,并最终写进了 RFC1945,也就是 HTTP/1.0 协议,正确的写法实际上是 Referrer。由于在http协议中标准错误了,错误大家就讲错就错,浏览器和服务端使用这个错误的 Referer,但是意思都是一个样的。

一般涉及到读取 HTTP 请求头的场景,我们需要用 Referer 这种错误拼写;除此之外一般都要用 Referrer 这种正确的拼写。

解决问题

公众号在输出图片的时候,会判断是从哪个网站访问这个图片,也就是 Referer, 如果你的网站在微信白名单内,就可以看到图片了。当然,我们不在~~。那要怎么办呢?

1、我们可以伪造一个 Referer

2、不发送Referer,那么微信会认为是从浏览器直接访问。

我们采用方式2来测试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

// Laravel
class BridgeController extends Controller
{


/**
* 图片renfer 防盗链代理
* @param Request $request [description]
* @return [type] [description]
*/
public function getImage(Request $request)
{
header("Content-Type:image/png");
$url = $request->input('url');
$imgString = $this->urlProxy($url,$userAgent='');
print_r($imgString);

}


private function urlProxy($url, $userAgent = '')
{
if ($userAgent == '') {


$userAgent = 'Mozilla/5.0 (iPhone 92; CPU iPhone OS 10_1_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0 MQQBrowser/7.2.1 Mobile/14B100 Safari/8536.25 MttCustomUA/2 QBWebViewType/1';
} else {
$userAgent = $userAgent;
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($ch);
curl_close($ch);
return $content;
}


}

然后在浏览器中访问 http://xxx.xxx/bridge/image/?url=http://mmbiz.qpic.cn/mmbiz_jpg/WRGz2LWLARA6ia7AqaEJP5PmWs5huZMMYIAvdqMSExEg5yZqlxicsgL1QB0XnD7Hc0UXzkYea7y4xiaiamXcCtxOFg/0?wx_fmt=jpeg

图片打印出来了~~

总结

So easy, Isn’t it~
当然,这只是演示,你可以在上面扩展一下~