文章主要介绍了PHP防止图片盗用(盗链)的方法,结合实例形式分析了php通过修改Apache服务器配置及目录访问权限等方式实现图片防盗链的相关 *** 作技巧,需要的朋友可以参考下.
本文实例总结了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 的`话),就执行下列转向:
?
1
RewriteRule .(jpg|gif|png|bmp|swf|jpeg) /image/replace.gif [R,NC,L]
意思是让所有盗链 img 目录下 jpg、gif、png、bmp、swf、jpeg 文件的网页,显示的图片都用 image 目录下的 replace.gif 图片替换掉。注意替换显示的图片不要放在设置防盗链的 img 目录下。如果照上面的规则判断出图片请求不是盗链的,就执行以下转向:
?
1
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
文件内容如下
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是d出框(输入用户名和密码)的标题
auth_basic_user_file /usr/local/nginx/conf/htpasswd中的/usr/local/nginx/conf/htpasswd是保存密码的文件
本文实例讲述了php简单防盗链实现方法。分享给大家供大家参考。具体如下:<?php $ADMIN = array('defaulturl'=>'http://blog.qita.in/images/banner-header.gif',//盗链返回的地址'url_1' =>'http://blog.qita.in/file','url_2' =>'http://blog.qita.in/file1', ) $okaysites = array( 'http://qita.in','http://blog.qita.in', //白名单'http://blog.qita.in/1.html', ) $reffer = $_SERVER['HTTP_REFERER'] if ($reffer) {$yes = 0 while (list($domain, $subarray) = each($okaysites)) { if (ereg($subarray, "$reffer")) {$yes = 1 }}$theu = 'url_' . $_GET['site'] $file = $_GET['file'] if ($ADMIN[$theu] and $yes == 1) {header("Location: $ADMIN[$theu]/$file") } else { header("Location: $ADMIN[defaulturl]") } } else {header("Location: $ADMIN[defaulturl]") } print_r($_SERVER['HTTP_REFERER']) ?>
分类: 电脑/网络 >>程序设计 >>其他编程语言问题描述:
有的网站的图片无法外链,如163等。它的原理是什么,为何别的网站用URL调不出它的图片
解析:
防盗链原理:
标准协议中有专门的字段记录referer
一来可以追溯上一个入站地址是什么
二来对于资源文件,可以跟踪到包含显示他的网页地址是什么。
因此所有防盗链方法都是基于这个Referer字段
网上比较多的2种
一种是使用apache文件FileMatch限制,在d.conf中增加 ( 其实也可以将把下面的语句存成一个.htaccess文件),并放到你的网站的根目录(就是/目录),这样子别人就没有办法盗连你的东东了~~
SetEnvIfNoCase Referer "^yahoo/" local_ref=1
Order Allow,Deny
Allow from env=local_ref
Allow from 127.0.0.1
这种很方便禁止非允许访问URL引用各种资源文件
请大家注意,把第一句"^yahoo/"改为你的网站,比如我的网站是: linji
我应该这么写的
"^linji/"
第二种是使用rewrite,需要增加apache的mode_rewrite,支持.htaccess文件目录权限限制
在虚拟主机根目录增加.htaccess文件,描述从定向,把非本地地址refer的图片文件都从定向到警告图片或者警告网页上。
首先要确认你的服务器或空间的服务器解译引擎为Apache2,还有支持.htaccess客户设置文件,
如果你有自己的服务器就请先对./conf/d.conf 文件做以下修改
找到:#LoadModule rewrite_module modules/mod_rewrite.so
把前面的 # 给去丢
找到等一个 AllowOverride None 改为 AllowOverride All
重启Apache2服务器
接下就是做一个 .htaccess 文件了,其 .htaccess 文件内容为
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^aaoo/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^]aaoo$ [NC]
RewriteCond %{HTTP_REFERER} !^aaoo/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^]aaoo$ [NC]
RewriteRule .*.(|jpeg|gif|png|bmp|rar|zip|exe)$ down.yoyo.ru/err [R,NC]
其中有色的地方都是要改为你的:
红色:就是改为你提供下载页面的地址,也就是只有通过这个地址才可以下载你所提供的东东。
蓝色:就是要保护文件的扩展名(以|分开),也就是说以这些为扩展名的文件只有通过红色的地址才可以访问。
绿色:如果不是通过红色的地址访问蓝色这些为扩展名的文件时就回重定向到绿色地址上。
这个方法有个好处是,不同的虚拟主机用不同的描述定义。
接下就是怎么用 .htaccess 文件来实现防盗链了。
首先要在空间上建两个目录(当然目录名随你),一个为 web 另一个为 down ,
web 是用来放下载页面的(或下载程序),down 当然就是放你提供的东东的啦,
把 .htaccess 文件的红色部分改一下,改为你的域名/web。蓝色部分
改为你要保护文件的扩展名。绿色部分改为你的域名/web。改后保存
.htaccess 文件把它上传到 down 目录。
还有第三种:
我在解决plog禁止盗链的时候,发现个问题,也算个好方法。
plog把所有资源都自己管理起来,用resserver.php来动态显示,这样统一的入口方便添加权限 *** 作。
同时造成上面2种方法无法使用,因为不再是apache直接访问资源文件,而是php通过文件读取。
因此只能在代码中做手脚:在读取资源文件输出之前,加如下判断代码
引用
$referer = $_SERVER['HTTP_REFERER']
$selfurl = $_SERVER['HTTP_HOST']
if(false == strpos($referer,$selfurl))
{
echo '非法盗链!'
exit(1)
}
这里有些偷懒,直接看引用地址中是否包含host地址,不过原理就是这样,判断referer是否是本站地址。
我们常常在下载的时候,也碰到盗链网站无法下载,报盗链的问题。要下载这类文件最简单的方法就是改referer
比方flashget中,网址下面的"引用"一栏中,直接填写下载地址就可以了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)