本文结合实例阐述了图片防盗链的参考原理和实现方法。分享给大家参考,如下:
1.图片防盗链
在一些大型网站中,比如百度贴吧,这个网站的图片采用了防盗链的规则,这样在使用下面的代码时就会出现错误。
简单代码:
!DOCTYPE html html head meta charset=' utf-8 ' meta http-equiv=' X-UA-Compatible ' content=' IE=edge ' title/title link rel='样式表' href=' '/head dy!-引用百度贴吧的一张图片-img src=' http :http://img src . Baidu.com/forum/pic/item/03 a 4462309 f 79052204229 be 04 f3d 7 ca 7 acbd 5 . jpg '/body/html问题:
错误的原因
主要是这个网站的图片采用了防盗链的规则,其实比较简单,一说出来你就知道了。主要原因是网站得知有请求时,会先判断请求头中的信息。如果请求头中有Referer信息,那么它将根据自己的规则判断Referer头信息是否满足要求。推荐人信息是请求此图片的源地址。
浏览器中的请求标题信息:
(1)正常使用百度贴吧查看图片的请求头信息
(2)我的代码的标题信息
相信读者会明白为什么我的代码不能访问图片,却显示了一张链盗的警告图片。因为我们的Referer头信息和百度贴吧不一样,当我的请求发出后,网站会查看Referer头信息,并在来源不是这个网站时重定向到另一张图片。
为自己的网站配置图片防盗链:
(1)在web服务器中打开mod _ rewrite模块
# load module rewrite _ modules/mod _ rewrite . so,//删除前面的#并重新启动服务器
(2)写作。需要防盗的网站或目录中的htaccess文件,并指定防盗链规则
步骤:
创建新的。创建一个新的文件搜索手册,并在。htaccess文件
指定规则:
如果它是一个图片资源,并且引用者标题信息来自这个站点,它就被传递
重写规则如下:
假设我的服务器是本地主机,规则意味着如果请求是图片资源,但是请求源不是这个站点,它将被重定向到当前目录中的no.png图片
Rewrite ENgine on Rewrite second % { SCRIPT _ FILENAME }。*.(jpg | JPEG | png | gif)[NC]Rewrite cond % { HTTP _ REFER }!localhost[NC]重写规则。* no.png
从本地主机访问:
从其他网站访问:
至此,我们已经了解了防盗链,但并不着急。因为它是请求头,所以可以伪造。先说说防盗链的规则。
2.防盗链
上图,我的服务器配置了图片防盗链。现在,我们用它来解释防盗链。如果我们在收集图片时遇到使用防盗链技术的网站,我们可以在收集图片时伪造一个Referer头信息。
下面的代码是从有图片防盗链的网站下载一张图片。
?Php/** *下载图片* @ authorwebbc */require '。/http . class . PHP ';//这个类是我自己为HTTp请求封装的类$ Http=new Http(' http://localhost/booledu/Http/apple . jpg ')。//$ http-setHeader(' refer :http://tieba . Baidu.com/');//设置referer头$ RES=$ http-get();$ content=strtr($ RES,' r n r n ');file_put_contents('。/toutupian.jpg ',substr($content,4));echo ' ok?不含推荐者标题信息的下载结果:
添加推荐人标题信息以下载结果:
与此相对应,我们应该能看到如何反制防盗链。事实上,它是添加一个参考标题信息。那么,我们在哪里可以找到每个网站的Referer头信息呢?这个要抓,要分析。
3.封装的Http请求类
?php/** * Http请求类* @ author webbc */class Http { const CRTF=' r n ';private $ errno=-1;private $ errstr=private $ time out=5;private $ url=null/解析后的全球资源定位器(统一资源定位符)数组私有$版本=' HTTP/1.1 ';//http版本private $ RequestLine=array();//请求行信息private $ header=array();//请求头信息private $ body=array();//请求实体信息private $ fh=null/连接端口后返回的资源私人$响应=' ';//返回的结果//构造函数public function _ _ construct($ URL){ $ this-connect($ URL);$this-setHeader('Host: ' .$ this-URL[' host ']);//设置头信息} //通过统一资源定位器进行连接公共函数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-time-out);} //设置请求行信息公共函数setrequest line($ method){ $ this-request line[0]=$ method .' '.$this-url['路径']。' '.$这个-版本;} //设置请求头信息公共函数setHeader($ header line){ $ this-header[]=$ header line;} //设置请求实体信息公共函数setBOdy($ body){ $ this-body[]=http _ build _ query($ body);} //发送得到请求公共函数GET(){ $ this-setrequest行(' GET ');//设置请求行$ this-request();//发送请求$ this-close();//关闭连接返回$ this-响应;} //发送请求私有函数请求(){ //拼接请求的全部信息$ reqestar=array _ merge($ this-request line,$this-header,array('),$this-body,array('));$req=内爆(self:CRTF,$ reqestar//print _ r($ req);死去;fwrite($this-fh,$ req);//写入信息//读取while(!feof($this-fh)){ $this-response .=fread($this-fh,1024);} } //发送邮政请求公共函数post($body=array()){ //设置请求行$ this-setrequest行(' POST ');//设置实体信息$ this-SetBody($ body);//设置Content-Type $ this-setHeader(' Content-Type :应用程序/x-www-form-URL编码');//设置内容-长度$此集标题('内容长度: ' .strlen($ this-body[0]);//请求$ this-request();$ this-close();//关闭连接返回$ this-响应;} //关闭连接公共函数close(){ fc lost($ this-FH);}}//测试get//$ Http=new Http(' http://news。163 .com/16/0915/10/c10e 2 ha 0014 pref。html ');//$ result=$ http-get();//echo $结果;//测试post/* set _ time _ limit(0);$ str=' abcdefghijklmnopqrstuvwxyz 0123456789 ';while(true){ $ Http=new Http(' http://211。70 .176 .138/yjhx/message。PHP’);$ str=str _ shuffle($ str);$username=substr($str,0,5);$email=substr($str,5,10).@ QQ。com$content=substr($str,10);$message='发表;$ http-post(array(' username '=$ username,' email'=$email,' content'=$content,' message '=$ message));//睡眠(0.1);}*/?更多关于服务器端编程语言(专业超文本预处理器的缩写)相关内容感兴趣的读者可查看本站专题: 《php socket用法总结》 、 《php字符串(string)用法总结》 、 《PHP数学运算技巧总结》 、 《php面向对象程序设计入门教程》 、 《PHP数组(Array)操作技巧大全》 、 《PHP数据结构与算法教程》 、 《php程序设计算法总结》 及《PHP网络编程技巧总结》
希望本文所述对大家服务器端编程语言(专业超文本预处理器的缩写)程序设计有所帮助。