PHP防止图片盗用(盗链)的方法小结


Posted in PHP onNovember 11, 2016

本文实例总结了PHP防止图片盗用(盗链)的方法。分享给大家供大家参考,具体如下:

图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量。本文章向大家介绍php防止图片盗用/盗链的两种方法

一、Apache图片重定向方法

设置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]
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]
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);
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 相关文章推荐
两个开源的Php输出Excel文件类
Feb 08 PHP
三个类概括PHP的五种设计模式
Sep 05 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
yii框架builder、update、delete使用方法
Apr 30 PHP
浅析php中json_encode()和json_decode()
May 25 PHP
Sublime里直接运行PHP配置方法
Nov 28 PHP
PHP中应该避免使用同名变量(拆分临时变量)
Apr 03 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
Mar 18 PHP
Zend Framework实现多文件上传功能实例
Mar 21 PHP
php获得刚插入数据的id 的几种方法总结
May 31 PHP
Yii框架核心组件类实例详解
Aug 06 PHP
PHP mkdir创建文件夹实现方法解析
Nov 13 PHP
PHP数据的提交与过滤基本操作实例详解
Nov 11 #PHP
thinkPHP多语言切换设置方法详解
Nov 11 #PHP
thinkPHP中钩子的两种配置调用方法详解
Nov 11 #PHP
php基于闭包实现函数的自调用(递归)实例分析
Nov 11 #PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 #PHP
PHP实现的方程求解示例分析
Nov 11 #PHP
php5.3后静态绑定用法详解
Nov 11 #PHP
You might like
php中通过smtp发邮件的类,测试通过
2007/01/22 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
thinkphp5使用无限极分类
2019/02/18 PHP
cnblogs csdn 代码运行框实现代码
2009/11/02 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
jQuery对Select的操作大集合(收藏)
2013/12/28 Javascript
常用DOM整理
2015/06/16 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
js 实现复选框只能选择一项的示例代码
2018/01/23 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
Linux中Python 环境软件包安装步骤
2016/03/31 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
python-numpy-指数分布实例详解
2019/12/07 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
超市仓管员岗位职责
2014/04/07 职场文书
端午节活动总结
2014/08/26 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
闪闪的红星观后感
2015/06/08 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
HTML中的表单元素介绍
2022/02/28 HTML / CSS