m3u8 php防盗链代码,突破防盗链原理详细讲解以及php代码

1 防盗的原理是什么?

当客户端(浏览器)向服务器请求内容的时候,会提交一个header,这个header中包含了如:浏览器信息、cookie等内容,那么有一个叫referer的东东,也包含在这里面。

referer是干啥用的呢?

它就是告诉服务器,这个请求的来源是谁,比如:从页面A跳转到页面B,那么页面B收到的referer就是页面A。

但是在图片身上和这个有点不同,图片是在html页面加载完毕后才加载的,所以图片收到的referer不是网页的上一个页面,而是当前页面。

说这么多,不要被说绕了,简单点就是:对于图片而言,收到的referer就是引用图片的这个网页的网址。

那么现在的很多网站是如何利用referer来进行防图片盗链的呢?

三种情况下允许引用图片:

本网站。

无referer信息的情况。(服务器认为是从浏览器直接访问的图片URL,所以这种情况下能正常访问)

授权的网址。

2 我们该如何绕过防盗链?

上面讲述了3种可以拿到图片的方法,方法1和3能实现吗?肯定不行,所以我们只能从方法2入手了。

要抹掉请求header中的信息,客户端(浏览器中的网页)是不行的,只能从服务端下手了。

大致思路如下:

eeabd8d1b53680fa620e751dd851f388.png

接下来,我们要做的就是做好中转工作:

先得有一台服务器(空间、虚拟主机都行)。

选择你熟悉的语言(php nodeJs java python均可)。

开始写代码。

放入前端页面中,使用。

3 开始编写代码

开篇就说啦,代码非常简单,所以不要有心理压力。我以PHP为例(这两年一直在玩nodejs,php放一边快凉了,昨天要处理一些复杂图片,发现这方面还是PHP顺手一点)。

A 先定义一个页面抓取函数。有了它,可以get和post网页,当然等会抓图片要用到它。我在原来的基础上优化了一下:

这样的话,有data提交,就自动post,没data提交就get。

这个函数写好后,先放php文件的最后,等会直接调用它就行了。

B 写主要部分,处理一些错误的情况。

header("Content-Type:image/png");//设置本文档将出输出的格式为png图片$string = $_SERVER["QUERY_STRING"]; //为什么要这样,而不用$_GET呢?因为可能图片地址中有&,那样就会被分割为多个参数,就会出错了。/*换一张空白图片,如果遇到错误,需要用上*/

$im = imagecreate(600, 300);

$black = imagecolorallocate($im, 100, 100, 100); //图片背景$white = imagecolorallocate($im, 255, 255, 255);

/*获取图片的真实地址*/

$url = strstr($string, "http");

if (!$url) {

imagettftext($im, 18, 0, 200, 100, $white, "./fonts/hwxh.ttf", "Error 001");

imagettftext($im, 14, 0, 150, 150, $white, "./fonts/hwxh.ttf", "请在参数中输入图片的绝对地址。");

imagepng($im);

exit();

}

@$imgString = urlOpen($url);

if ($imgString == "") {

imagettftext($im, 18, 0, 200, 100, $white, "./fonts/hwxh.ttf", "Error 002");

imagettftext($im, 14, 0, 70, 150, $white, "./fonts/hwxh.ttf", "加载远程图片失败,请确认图片的地址能正常访问。");

imagepng($im);

exit();

}

?>

上面一部分主要是对引用图片时出现错误的情况的处理,一个是没有告诉服务器图片的真实URL,另一个是图片的真实地址无法访问。出现这两种情况,就用图片的方式输出错误提示。

./fonts/hwxh.ttf这是字体,放在相对路径下的对应位置,也可以不用这个,直接去系统字体里面复制字体的名称也可以。

C 做了那么多准备工作,正事这才开始,开始抓图片并输出:

/*如果没有错误*/

$im = imagecreatefromstring($imgString);//上面已经把图片的内容拿到了,直接用它生成一张图片$white = imagecolorallocate($im, 255, 255, 255);

/*加上水印*/

//imagettftext($im, 12, 0, 20, 20, $white, "./fonts/hwxh.ttf", "水印的文字1");imagepng($im);

?>

好无语了,前面一堆东西那么多,真正的东西就3行??

是的,你没看错,就这么点。当然,你可以给图片加上水印什么的,让它更有特色。

4 最终代码

最后整理后,代码如下:

header("Content-Type:image/png");//设置本文档将出输出的格式为png图片$string = $_SERVER["QUERY_STRING"]; //为什么要这样,而不用$_GET呢?因为可能图片地址中有&,那样就会被分割为多个参数,就会出错了。/*换一张空白图片,如果遇到错误,需要用上*/

$im = imagecreate(600, 300);

$black = imagecolorallocate($im, 100, 100, 100); //图片背景$white = imagecolorallocate($im, 255, 255, 255);

/*获取图片的真实地址*/

$url = strstr($string, "http");

if (!$url) {

imagettftext($im, 18, 0, 200, 100, $white, "./fonts/hwxh.ttf", "Error 001");

imagettftext($im, 14, 0, 150, 150, $white, "./fonts/hwxh.ttf", "请在参数中输入图片的绝对地址。");

imagepng($im);

exit();

}

@$imgString = urlOpen($url);

if ($imgString == "") {

imagettftext($im, 18, 0, 200, 100, $white, "./fonts/hwxh.ttf", "Error 002");

imagettftext($im, 14, 0, 70, 150, $white, "./fonts/hwxh.ttf", "加载远程图片失败,请确认图片的地址能正常访问。");

imagepng($im);

exit();

}

/*如果没有错误*/

$im = imagecreatefromstring($imgString);//上面已经把图片的内容拿到了,直接用它生成一张图片$white = imagecolorallocate($im, 255, 255, 255);

/*加上水印*/

//imagettftext($im, 12, 0, 20, 20, $white, "./fonts/hwxh.ttf", "水印的文字1");imagepng($im);

/*通用远程GET POST函数*/

function urlOpen($url, $data = null, $ua = 'MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1')

{

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_USERAGENT, $ua);

if ($data) {

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

}

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$content = curl_exec($ch);

curl_close($ch);

return $content;

}

?>

5 最后检测

我在本地localhost中,成功中转了pixabay上的图片(这网站有防盗链的)。

ad06046be5513b59cebe19ecf59d3e4e.png

6 一些提示

用自己的服务器做中转,如果目标图片太大,那么小水管的服务器肯定是吃不消的,pixabay这种最大尺寸有照片有几M甚至几十M,可以加载速度会很慢很慢,所以可以把php的执行时间设置长一点。

同时,如果服务器带宽很小,建议不要把自己的接口开放给别人用,免费影响自己网站。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值