php有效防止图片盗用、盗链的两种方法


Posted in PHP onNovember 01, 2016

如今的互联网,采集网站非常多,很多网站都喜欢盗链/盗用别人网站的图片,这样不仅侵犯网权,还导致被盗链的网站消耗大量的流量,给服务器造成比较大的压力,本文章向大家介绍php如何防止图片盗用/盗链的两种方法,需要的朋友可以参考一下。

图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量。

本文章向大家介绍php防止图片盗用/盗链的两种方法

1、Apache图片重定向方法
2、设置images目录不充许http访问 

Apache服务器下防止图片盗链的办法
如果你的网站以图片为主,哪天发现月底没到流量就快用光了,那就可以利用图片转向,在不修改网页的前提下,把图片下载请求转向到其它空间(比如试用主机),临时过渡。

下面开始讲解,比如你的图片都在img目录下,那就在该目录下放一个名为 .htaccess 的文件,内容如下:

RewriteEngine on
 
RewriteCond %{HTTP_REFERER} !^$ [NC]
 
RewriteCond %{HTTP_REFERER} !simcole.cn [NC]
 
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]
 
RewriteCond %{HTTP_REFERER} !google.com [NC]
 
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
 
RewriteCond %{HTTP_REFERER} !bloglines.com [NC]
/* 作者:码农教程 http://www.manongjc.com  */
RewriteRule .(jpg|gif|png|bmp|swf|jpeg) /image/replace.gif [R,NC,L]
 
RewriteRule ^(.*)$ http://image.simcole.cn/image/$1 [L]
复制代码

大概解释下:

RewriteCond %{HTTP_REFERER} !^$ [NC]
 
RewriteCond %{HTTP_REFERER} !simcole.cn [NC]
 
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]
 
RewriteCond %{HTTP_REFERER} !google.com [NC]
/* 作者:码农教程 http://www.manongjc.com/article/1550.html  */
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
 
RewriteCond %{HTTP_REFERER} !bloglines.com [NC]

这部分是判断是否盗链,如果以上条件都成立(即访问图片的请求,既不是直接输入网址,也不是来自simcole.cn,也不是来自zhuaxia.com,也不是来自google.com,也不是来自baidu.com,也不是来自bloglines.com 的话),就执行下列转向:

RewriteRule .(jpg|gif|png|bmp|swf|jpeg) /image/replace.gif [R,NC,L]

意思是让所有盗链 img 目录下 jpg、gif、png、bmp、swf、jpeg 文件的网页,显示的图片都用 image 目录下的 replace.gif 图片替换掉。注意替换显示的图片不要放在设置防盗链的 img 目录下。如果照上面的规则判断出图片请求不是盗链的,就执行以下转向:

RewriteRule ^(.*)$ http://image.simcole.cn/image/$1 [L]

意思是对 img 目录下所有的请求都转向到目标服务器,比如有个图片原来的 url 是 http://www.bebecn.com/img/girl.jpg ,现在就会转到 http://image.bebecn.com/image/girl.jpg 去。当然了你得先把原服务器 img 目录下的文件统统拷贝到临时服务器的 image 目录下,转向才会真正可用。起到的效果就是把原服务器图片下载所占用的流量统统省下,让临时服务器来承受了.

 设置images目录不充许http访问

把images目录设置成不充许http访问(把图片目录的:读取、目录浏览 两个权限去掉)。
用一个PHP文件,直接用file函数读取这个图片。在这个PHP文件里进行权限控制。
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

其他web环境如iss,nginx也类似。

class imgdata{
public $imgsrc;
public $imgdata;
public $imgform;
public function getdir($source){
$this->imgsrc = $source;
}
public function img2data(){
$this->_imgfrom($this->imgsrc);
return $this->imgdata=fread(fopen($this->imgsrc,'rb'),filesize($this->imgsrc));
}
public function data2img(){
header(“content-type:$this->imgform”);
echo $this->imgdata;
//echo $this->imgform;
//imagecreatefromstring($this->imgdata);
}
public function _imgfrom($imgsrc){
$info=getimagesize($imgsrc);
//var_dump($info);
/* 作者:码农教程 http://www.manongjc.com  */
return $this->imgform = $info['mime'];
}
}
$n = new imgdata;
$n -> getdir(“1.jpg”); //图片路径,一般存储在数据库里,用户无法获取真实路径,可根据图片ID来获取
$n -> img2data();
$n -> data2img();

这段代码是读取图片,然后直接输出给浏览器,在读取和输出之前,进行用户权限判断。
这里说的PHP读取图片,不是指读取路径,而是指读取图片的内容,然后通过Header();输入图片类型,比如 gif png jpg等,下面输出图片的内容,所以用到了fread()。

实际上,你看到 image.php?id=100 就是显示这张图片在浏览器上,而你查看源文件,看到的不会是图片的路径,而是乱码似的图片内容。

类似于qq空间的加密相册,只有输入密码才能访问,并且直接在浏览器输入 加密相册中的相片地址也是无法访问。我目前的想法是 图片的地址是一个php文件,通过 php 验证权限 ,读取图片,并输出,不知道除了这样的方法还有更简单高效的做法没有?比如生成临时的浏览地址,使用一些 nginx 的一些防盗链插件?
你可以利用ngx_http_auth_basic_module来完成。

修改配置文件

location / {
root /usr/local/nginx/html;
auth_basic “Auth”;
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
index index.php index.htm;
}

auth_basic “Auth”中的Auth是弹出框(输入用户名和密码)的标题
auth_basic_user_file /usr/local/nginx/conf/htpasswd; 中的/usr/local/nginx/conf/htpasswd是保存密码的文件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php 运行效率总结(提示程序速度)
Nov 26 PHP
php下图片文字混合水印与缩略图实现代码
Dec 11 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
php隐藏实际地址的文件下载方法
Apr 18 PHP
PHP代码实现表单数据验证类
Jul 28 PHP
PHP常见漏洞攻击分析
Feb 21 PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 PHP
PHP页面跳转实现延时跳转的方法
Dec 10 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
PHP一个简单的无需刷新爬虫
Jan 05 PHP
ThinkPHP5与单元测试PHPUnit使用详解
Feb 23 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
Aug 17 PHP
php 实现一个字符串加密解密的函数实例代码
Nov 01 #PHP
PHP+Ajax异步带进度条上传文件实例
Nov 01 #PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 #PHP
PHP用户验证和标签推荐的简单使用
Oct 31 #PHP
PHP实现小偷程序实例
Oct 31 #PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
Oct 31 #PHP
利用php做服务器和web前端的界面进行交互
Oct 31 #PHP
You might like
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
PHP 采集心得技巧
2009/05/15 PHP
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
培养自己的php编码规范
2015/09/28 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
jquery ui dialog ie8出现滚动条的解决方法
2010/12/06 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
Python urlopen()函数 示例分享
2014/06/12 Python
Python日期的加减等操作的示例
2017/08/15 Python
Python中将dataframe转换为字典的实例
2018/04/13 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
工程师求职简历的自我评价分享
2013/10/10 职场文书
货代行业个人求职简历的自我评价
2013/10/22 职场文书
教师找工作推荐信
2013/11/23 职场文书
个人生活学习自我评价范文
2013/11/26 职场文书
爱国口号
2014/06/19 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript