php如何控制用户对图片的访问 PHP禁止图片盗链


Posted in PHP onMarch 25, 2016

把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禁止图片盗链
1、假设充许连结图片的主机域名为:www.test.com
2、修改httpd.conf

SetEnvIfNoCase Referer “^http://www.test.com/” local_ref=1

<FilesMatch “.(gif|jpg)”>

Order Allow,Deny

Allow from env=local_ref

</FilesMatch>

这个简单的应用不光可以解决图片盗链的问题,稍加修改还可以防止任意文件盗链下载的问题。
使用以上的方法当从非指定的主机连结图片时,图片将无法显示,如果希望显示一张“禁止盗链”的图片,我们可以用mod_rewrite 来实现。
首先在安装 apache 时要加上 ?enable-rewrite 参数加载 mod_rewrite 模组。
假设“禁止盗链”的图片为abc.gif,我们在 httpd.conf 中可以这样配置:

RewriteEngine on

RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^http://(www\.)?test.com /.*$ [NC]

RewriteRule \.(gif|jpg)$ http://www.test.com/abc.gif [R,L]

当主机的图片被盗链时,只会看到 abc.gif 这张“禁止盗链”的图片!

PHP 相关文章推荐
几种显示数据的方法的比较
Oct 09 PHP
Zend Framework中的简单工厂模式 图文
Jul 10 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
php curl中gzip的压缩性能测试实例分析
Nov 08 PHP
Zend Framework分发器用法示例
Dec 11 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
php无限级评论嵌套实现代码
Apr 18 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 PHP
PHP 对象接口简单实现方法示例
Apr 13 PHP
TP5多入口设置实例讲解
Dec 15 PHP
常见的5个PHP编码小陋习以及优化实例讲解
Feb 27 PHP
PHP 生成微信红包代码简单
Mar 25 #PHP
PHP实现动态执行代码的方法
Mar 25 #PHP
PHP动态生成指定大小随机图片的方法
Mar 25 #PHP
PHP5.2中PDO的简单使用方法
Mar 25 #PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 #PHP
PHP错误机制知识汇总
Mar 24 #PHP
ThinkPHP的常用配置选项汇总
Mar 24 #PHP
You might like
第二节--PHP5 的对象模型
2006/11/16 PHP
用PHP写的MySQL数据库用户认证系统代码
2007/03/22 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
php生成gif动画的方法
2015/11/05 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
用js替换除数字与逗号以外的所有字符的代码
2014/06/07 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
vue+element table表格实现动态列筛选的示例代码
2021/01/14 Vue.js
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
Pycharm远程调试openstack的方法
2017/11/21 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
酷瑞网络科技面试题
2012/03/30 面试题
写自荐信三大法宝
2014/01/24 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
相亲大会策划方案
2014/06/05 职场文书
2019年幼儿园家长接送责任书
2019/10/29 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL
详解JavaScript中的执行上下文及调用堆栈
2021/04/29 Javascript
Redis做数据持久化的解决方案及底层原理
2021/07/15 Redis
python接口测试返回数据为字典取值方式
2022/02/12 Python