广州凡科互联网科技有限公司

营业时间
MON-SAT 9:00-18:00

全国服务热线
18720358503

公司门店地址
广州市海珠区工业大道北67号凤凰创意园

Referer基本原理与照片防盜链完成方式详细说明

日期:2021-04-15 浏览:

本文关键详细介绍了Referer基本原理与照片防盜链完成方式,融合案例方式详尽剖析了Referer头信息内容基本原理与照片防盜链判断、完成方式,并附加一个Http恳求封裝类,必须的朋友能够参照下

文中案例叙述了Referer基本原理与照片防盜链完成方式。共享给大伙儿供大伙儿参照,实际以下:

1、照片防盜链

在一些大中型网站内,例如百度搜索百度贴吧,该站点的照片选用了防盜链的标准,以致于应用下边编码会产生不正确。

简易编码:

 !DOCTYPE html 
 html 
 head 
 meta charset="utf-8" 
 meta http-equiv="X-UA-Compatible" content="IE=edge" 
 title /title 
 link rel="stylesheet" href="" 
 /head 
 body 
 !--引入一张百度搜索百度贴吧的照片-- 
 img src="forum/pic/item/03a4464229be04f3d7ca7acbd5d5.jpg"/ 
 /body 
 /html 

出現的难题:

这里写图片描述

错误的缘故

关键是该站点的照片选用了防盜链的标准,实际上这一标准也较为简易, 和大伙儿一说就了解啦,关键是该站点在获知有恳求时,会先分辨恳求头中的信息内容,假如恳求头中有Referer信息内容,随后依据自身的标准来分辨Referer头信息内容是不是合乎规定,Referer 信息内容是恳求该照片的来源于详细地址。

访问器中的恳求头信息内容:

(1)一切正常应用百度搜索百度贴吧查询照片的恳求头信息内容

这里写图片描述

(2)我的编码的头信息内容

这里写图片描述

坚信阅读者见到这,也就搞清楚了,为何我的编码不可以浏览到照片,只是显示信息一张警示盗链照片,由于大家的Referer头信息内容和百度搜索百度贴吧的不一样,当我们的恳求传出去时,该站点查询Referer头信息内容,一来看源并不是本网站,就跳转到此外一幅图片了。

为自己的站点配备照片防盜链:

(1)在web网络服务器中打开mod_rewrite控制模块

#LoadModule rewrite_module modules/mod_rewrite.so,//将前边的#给除掉,随后再次起动网络服务器

(2)在必须防盜的网站或文件目录中,ess文档,并特定防盜链标准

流程:

ess文档,在windows中应用另存为的方法来在建此篇件
搜索指南,ess文档中运用正则表达式分辨

特定标准:

假如是照片資源且referer头信息内容是来源于于本网站,则根据

重新写过标准以下:

假设我的网络服务器是localhost,标准的含意是,假如恳求的是照片資源,可是恳求来源于并不是本网站得话,就跳转到当今文件目录的一张no.png的照片上

RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} .*\.(jpg|jpeg|png|gif) [NC]
RewriteCond %{HTTP_REFERER} !localhost [NC]
RewriteRule .* no.png

来源于localhost的浏览:

这里写图片描述

来源于于别的站点的浏览:

这里写图片描述

到此,有关防盜链的专业知识大家学好了,可是不慌,即然是一个恳求头,自然是能够仿冒的,下边大家来讲一下反防盜链的标准。

2、反防盜链

上边我的网络服务器配备了照片防盜链,如今以它来说解反防盜链,假如大家在收集照片的情况下,碰到应用防盜链技术性的站点,大家能够在收集照片的情况下仿冒一个Referer头信息内容。

下边的编码是以一个配备了照片防盜链的站点免费下载一幅图片。

 php
 * 免费下载照片
 * @author webbc
require './Http.class.php';//这一类就是我自身封裝的一个用以HTTp恳求的类
$http = new Http("booledu/http/apple.jpg");
//$http- setHeader('Referer:');//设定referer头
$res = $http- get();
$content = strstr($res,"\r\n\r\n");
file_put_contents('./toutupian.jpg',substr($content,4));
echo "ok";

不用Referer头信息内容免费下载的結果:

这里写图片描述

加Referer头信息内容免费下载的結果:

这里写图片描述

相对大伙儿见到这,应当可以看出去怎样反防盜链吧,实际上便是再加一个Referer头信息内容,那麼,每一个站点的Referer头信息内容从哪儿找呢?这一应当抓包软件剖析便可以得到来啦!

3、封裝的Http恳求类

 php
 * Http恳求类
 * @author webbc
class Http{
 const CRTF = "\r\n";
 private $errno = -1;
 private $errstr = '';
 private $timeout = 5;
 private $url = null;//分析后的url数字能量数组
 private $version = 'HTTP/1.1';//http版本号
 private $requestLine = array();//恳求行信息内容
 private $header = array();//恳求头信息内容
 private $body = array();//恳求实体线信息内容
 private $fh = null;//联接端口号后回到的資源
 private $response = '';//回到的結果
 //结构涵数
 public function __construct($url){
 $this- connect($url);
 $this- setHeader('Host:'.$this- url['host']);//设定头信息内容
 //根据URL开展联接
 public function connect($url){
 $this- url = parse_url($url);//分析url
 if(!isset($this- url['port'])){
 $this- url['port'] = 80;
 $this- fh = fsockopen($this- url['host'],$this- url['port'],$this- errno,$this- errstr,$this- timeout);
 //设定恳求行信息内容
 public function setRequestLine($method){
 $this- requestLine[0] = $method.' '.$this- url['path'].' '.$this- version;
 //设定恳求头信息内容
 public function setHeader($headerLine){
 $this- header[] = $headerLine;
 //设定恳求实体线信息内容
 public function setBody($body){
 $this- body[] = http_build_query($body);
 //推送get恳求
 public function get(){
 $this- setRequestLine('GET');//设定恳求行
 $this- request();//推送恳求
 $this- close();//关掉联接
 return $this- response;
 //推送恳求
 private function request(){
 //拼凑恳求的所有信息内容
 $reqestArr = array_merge($this- requestLine,$this- header,array(''),$this- body,array(''));
 $req = implode(self::CRTF,$reqestArr);
 //print_r($req);die;
 fwrite($this- fh,$req);//载入信息内容
 //载入
 while(!feof($this- fh)){
 $this- response .= fread($this- fh,1024);
 //推送post恳求
 public function post($body = array()){
 //设定恳求行
 $this- setRequestLine("POST");
 //设定实体线信息内容
 $this- setBody($body);
 //设定Content-Type
 $this- setHeader('Content-Type:application/x-www-form-urlencoded');
 //设定Content-Length
 $this- setHeader('Content-Length:'.strlen($this- body[0]));
 //恳求
 $this- request();
 $this- close();//关掉联接
 return $this- response;
 //关掉联接
 public function close(){
 fclose($this- 
//检测get
// $http = new Http("16/0915/");
// $result = $http- get();
// echo $result;
//检测post
/*set_time_limit(0);
$str = 'abcdefghijklmnopqrstuvwxyz';
while(true){
 $http = new Http("");
 $str = str_shuffle($str);
 $username = substr($str,0,5);
 $email = substr($str,5,10).'';
 $content = substr($str,10);
 $message = "发布";
 $http- post(array('username'= $username,'email'= $email,'content'= $content,'message'= $message));
 //sleep(0.1);

大量有关PHP有关內容很感兴趣的阅读者能查看本网站专题讲座:《php socket使用方法小结》、《php标识符串(string)使用方法小结》、《PHP数学课计算方法小结》、《php朝向目标编程设计新手入门实例教程》、《PHP数字能量数组(Array)实际操作方法全集》、《PHP数据信息构造与优化算法实例教程》、《php编程设计优化算法小结》及《PHP互联网程序编写方法小结》

期待文中上述对大伙儿PHP编程设计有一定的协助。



新闻资讯

联系方式丨CONTACT

  • 全国热线:18720358503
  • 传真热线:18720358503
  • Q Q咨询:2639601583
  • 企业邮箱:2639601583@qq.com

首页
电话
短信
联系