科学技术十分发达的今天,在互联网世界里,采集网站非常多,很多网站都喜欢盗链或者盗用别人网站的图片,这样不仅侵权,还导致被盗链的网站消耗大量的流量,给服务器造成比较大的压力。那么接下来谈一谈如何进行有效地防止盗链操作。
直接访问图片,成功访问
那么如何控制不能直接访问图片呢?
我们可以把images目录设置成不充许http访问(把图片目录的:读取、目录浏览 两个权限去掉)。
apache环境中,在你的图片目录中加上下面这个文件即可。
文件名 .htaccess
# options the .htaccess files in directories can override. # Edit apache/conf/httpd.conf to AllowOverride in .htaccess # AllowOverride AuthConfig # Stop the directory list from being shown Options -Indexes # Controls who can get stuff from this server. Order Deny,Allow Deny from all Allow from localhost
如图所示:
加上该文件后,直接访问图片,就会出现以下提示,这样就有效控制直接访问图片了
直接走代码,用代码说话。
我们先来看下$_SERVER['HTTP_REFERER']是什么?
答案是
来源网址。
比如你当前访问a.php,这个文件上面有一个连接到b.php的超链接,当你点击超链后,这个值就是a.php,如果在浏览器中直接输入b.php访问,这个值就是空。
本机测试页面:
<!DOCTYPE html> <html lang="en"> <head> <title>防盗链页面</title> <meta charset="utf-8"> </head> <body> <img src="http://127.0.0.1/fangdaolian/image.php?img_id=1" alt="" width="250" height="350" /> <a href="http://127.0.0.1/fangdaolian/image.php?img_id=1" target="_blank">点我看图</a> </body> </html>
后端处理代码:
<?php class Imgdata{ public $img_id; public function __construct($id){ header('Content-Type: image/jpeg'); $this->img_id = $id; } //输出图片 public function output_img(){ //进行防盗链处理 if(isset($_SERVER['HTTP_REFERER'])){ $parse_url = parse_url($_SERVER['HTTP_REFERER']);//对来源网址进行解析 $allow_host_arr = [//运行访问的主机数组,实际项目开发时,可以通过配置文件进行配置 '127.0.0.1', 'localhost', '192.168.2.54' ]; if(in_array($parse_url['host'], $allow_host_arr)){ echo file_get_contents("images/".$this->img_id.".jpg"); }else{ echo file_get_contents('images/fdl2.png');//如果是防盗链,则已警告图片进行展现 } }else{ echo file_get_contents('images/fdl1.png');//如果是防盗链,则已警告图片进行展现 } } } $img_id = $_GET['img_id'];//获取图片id $img = new Imgdata($img_id);//图片路径,一般存储在数据库里,用户无法获取真实路径,可根据图片ID来获取 $img->output_img();//输出图片
浏览器访问:
点击“点我看图”,成功访问
均能正常访问
那么,现在我们把代码部署到远程服务器上(模拟成别人的图片服务器),看下情况如何
本地测试页面(模拟成自己的项目)代码改成:
<!DOCTYPE html> <html lang="en"> <head> <title>防盗链页面</title> <meta charset="utf-8"> </head> <body> <img src="http://125.77.22.119:20322/fangdaolian/image.php?img_id=1" alt="" width="250" height="350" /><!--盗用远程服务器的图片--> <a href="http://125.77.22.119:20322/fangdaolian/image.php?img_id=1" target="_blank">点我看图</a><!--盗用链接--> </body> </html>
远程服务器的主机设置为
现在浏览器访问情况:
然后点击“点我看图”,还是会提示错误,无法访问图片
通过该测试,我们就成功的模拟了自己项目里盗用别人的链接操作,及时访问路径正确也无法访问。