当前位置: 首页 > 后端技术 > PHP

图片防盗破解解决图片防盗反向代理的问题

时间:2023-03-30 05:08:25 PHP

很多小伙伴的博客网站都是用图床实现的,所以现在很多稳定的图床接口都做了防盗链处理,比如百度、阿里、京东、小米、搜狗等。那么我们应该如何避开防盗链,直接使用图片呢?1防盗的原理是什么?客户端(浏览器)向服务器请求内容的时候,会提交一个header,这个header里面包含的内容比如:浏览器信息,cookies等等,然后还有一个叫做referer的东西,也包含在里面。什么是推荐人?它告诉服务器请求的来源是谁,例如:如果你从页面A跳转到页面B,那么页面B收到的referer就是页面A。但是图片和这个有点不一样。图片是在html页面加载完之后加载的,所以图片接收到的referer不是网页的上一页,而是当前页。说了这么多,大家不要上当受骗了。简单点就是:对于图片,收到的referer就是引用图片的网页的URL。那么很多网站是如何使用referer来防止图片盗链的呢?图片引用在三种情况下是允许的:本网站。当没有referer信息时。(服务器认为是浏览器直接访问的图片URL,所以这种情况下可以正常访问)白名单URL。开始做防盗链处理1.需要一个服务器2.代码使用php$value){$this->$key=$value;}}publicfunctiongetImg($imgUrl){$this->imgUrl=$imgUrl;/**进程url*/if(substr($this->imgUrl,0,7)!=='http://'&&substr($this->imgUrl,0,8)!=='https://'){$this->imgUrl='http://'.$this->imgUrl;}/**解析url中的host*/$url_array=parse_url($this->imgUrl);/**设置引用*/$this->referer=$this->referer==""?'http://'.$url_array['host']:$this->referer;/**开始获取*/$this->urlOpen();$this->imgBody;/**处理错误*/if($this->imgCode!=200){$this->error(1);出口();}/**获取图片格式*/preg_match("/Content-Type:image\/(.+?)\n/sim",$this->imgHeader,$result);/**检查是否是图片*/if(!isset($result[1])){$this->error(2);出口();}else{$this->imgType=$result[1];}/**输出内容*/$this->out();}privatefunctionout(){/**gif不处理,直接输出图片*/if($this->imgType=='gif'){header("Content-Type:image/gif");回声$这个->img正文;出口();}header("Content-Type:image/png");/**其他类型的,加水印*/$im=imagecreatefromstring($this->imgBody);$white=imagecolorallocate($im,255,255,255);/*加上水印*/if($this->water){imagettftext($im,12,0,20,20,$white,"/fonts/hwxh.ttf",$this->water);}imagepng($im);}privatefunctionerror($err){header("Content-Type:image/jpeg");$im=imagecreatefromstring(file_get_contents('./default.jpg'));imagejpeg($im);}私有函数urlOpen(){$ch=curl_init();curl_setopt($ch,CURLOPT_URL,$this->imgUrl);curl_setopt($ch,CURLOPT_USERAGENT,$this->ua);curl_setopt($ch,CURLOPT_REFERER,$this->referer);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);curl_setopt($ch,CURLOPT_HEADER,1);/**跳转也要*/curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);/**支持https*/$opt[CURLOPT_SSL_VERIFYHOST]=2;$opt[CURLOPT_SSL_VERIFYPEER]=FALSE;curl_setopt_array($ch,$opt);$response=curl_exec($ch);$this->imgCode=curl_getinfo($ch,CURLINFO_HTTP_CODE);如果($this->imgCode=='200'){$headerSize=curl_getinfo($ch,CURLINFO_HEADER_SIZE);$this->imgHeader=substr($response,0,$headerSize);$this->imgBody=substr($response,$headerSize);返回;}curl_close($ch);}}$img=newImgBridge(array('water'=>''));$img->getImg(strstr($_SERVER["QUERY_STRING"],"http"));如果代码名为dl.php,可以直接访问http://域名/dl.php?url=防盗链图片地址原文:如何绕过图片防盗引用别人网站的图片在你自己的网站上?不懂的可以找我学习微信:sansure2016